Desenhe elipses com cores diferentes para sua interseção no tikz?

Desenhe elipses com cores diferentes para sua interseção no tikz?

Como faço para colorir a interseção de duas elipses em cores diferentes. Por exemplo, as próprias elipses devem ser coloridas em amarelo e sua interseção em vermelho. Meu código para desenhar elipses é fornecido abaixo

\draw (-4,0) ellipse (8 and 3);
\draw (8,0) ellipse (8 and 3);

ATUALIZAÇÃO: Nos comentários às respostas individuais, solicitei mostrar três reticências.

Responder1

Como você pode ver emessesexemplos e emComo desenhar diagramas de Venn (especialmente: complementos) em LaTeX, é bastante fácil desenhar essas elipses, desde que uma das cores de preenchimento seja branca.

Quando você quiser 2 cores de preenchimento diferentes e usar os métodos descritos nos exemplos anteriores, certifique-se de preencher primeiro a elipse e desenhá-las depois:

\documentclass[border=2mm]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
    \def\firstellipse{(-4,0) ellipse (8 and 3)}
    \def\secondellipse{(8,0) ellipse (8 and 3)}

    % colour ellipses
    \fill[yellow] \firstellipse \secondellipse;

    % colour intersection
    \begin{scope}
        \clip \firstellipse;
        \fill[red] \secondellipse;
    \end{scope}

    % outiline of ellipses
    \draw \firstellipse \secondellipse;
\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

EDITAR:em resposta ao seu pedido de comentário de três reticências

A ideia permanece a mesma:

  1. preencha suas elipses
  2. preencha seus cruzamentos
  3. desenhe suas elipses

Então isso lhe dá:

\documentclass[border=2mm]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
    \def\firstellipse{(-4,0) ellipse [x radius=8, y radius=3, rotate=150]}
    \def\secondellipse{(8,0) ellipse [x radius=8, y radius=3, rotate=30]}
    \def\thirdellipse{(2,-10.5) ellipse [x radius=8, y radius=3, rotate=90]}
    \def\boundingbox{(-12,-16) rectangle (16,3)}

    % fill ellipses
    \fill[yellow] \firstellipse \secondellipse \thirdellipse;

    % fill intersections
    % intersection of second and third
    \begin{scope}
        \clip \boundingbox \firstellipse;
        \clip \secondellipse;
        \fill[blue] \thirdellipse;
    \end{scope}
    % intersection of first and third
    \begin{scope}
        \clip \boundingbox \secondellipse;
        \clip \firstellipse;
        \fill[green] \thirdellipse;
    \end{scope}
    % intersection of first and second
    \begin{scope}
        \clip \boundingbox \thirdellipse;
        \clip \firstellipse;
        \fill[gray] \secondellipse;
    \end{scope}
    % intersection of first, second and third
    \begin{scope}
        \clip \firstellipse;
        \clip \secondellipse;
        \clip \thirdellipse;
        \fill[red] \boundingbox;
    \end{scope}

    % outline of ellipses
    \draw \firstellipse \secondellipse \thirdellipse;
\end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Se você quiser que todas as interseções sejam vermelhas, altere as cores azul, verde e cinza para vermelho.

Se você quiser elipses giradas, use

\def\firstellipse{(-4,0) ellipse [x radius=8, y radius=3, rotate=45]}

Responder2

Outra opção com \tikzfillbetweencomando da pgfplot's fillbetweenbiblioteca.

\documentclass[tikz,border=2mm]{standalone}
\usepackage{pgfplots}
\usepgfplotslibrary{fillbetween}

\begin{document}
  \begin{tikzpicture}
    \draw[name path=A, fill=red] (-4,0) ellipse (8 and 3);
    \draw[name path=B] (8,0) ellipse (8 and 3);
    \tikzfillbetween[of=A and B]{yellow};
  \end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Responder3

Você pode primeiro preencher uma elipse com a cor vermelha e desenhar (com preenchimento) duas elipses usandoeven odd rule

\documentclass[tikz,border=2mm]{standalone}
\begin{document}
  \begin{tikzpicture}
    \fill[red] (-4,0) ellipse (8 and 3);
    \draw[fill=yellow,even odd rule,line width=1pt] (-4,0) ellipse (8 and 3)
                                                    (8,0) ellipse (8 and 3);
  \end{tikzpicture}
\end{document}

insira a descrição da imagem aqui

Responder4

Aqui está uma tentativa comMetaPost(incluído no programa LuaLaTeX), para quem tiver interesse.

Observe que também não é fácil desenhar esse tipo de interseção com o MetaPost. Se você observar a definição da primeira elipse no programa abaixo,

fullcircle rotated 90 xscaled 9cm yscaled 3cm shifted (3.2cm, 0);

então observe a rotated 90parte. Parece estranho, pois significa que uma rotação é aplicada a um círculo, mas se você suprimir esta parte,nadafuncionaria. A explicação está nos meandros da buildcyclemacro do MetaPost (a mesma queAssíntota's, aliás), que foram discutidos em detalhesneste tópico.

ATUALIZARComo a segunda elipse está agora definida de uma maneira diferente da anterior (ou seja, agora girando a primeira), isso torna rotated 90desnecessária a parte na definição da primeira elipse. Simplifiquei o código de acordo. Ainda assim, é bom ter em mente a limitação da buildcyclemacro ao abordar este tipo de tarefa.

\documentclass{standalone}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}

color yellow; yellow = red+green;

def erase_and_fill expr pat = unfill pat; fill pat enddef;

path fig[];
fig1 = fullcircle xscaled 9cm yscaled 3cm shifted (3.2cm, 0); 
fig2 = fig1 rotated 180;

beginfig(1); 
    for i = 1, 2: erase_and_fill fig[i] withcolor yellow; endfor
    erase_and_fill buildcycle(fig1, fig2) withcolor red; 
    for i = 1, 2: draw fig[i]; endfor 
endfig;

\end{mplibcode}
\end{document}

insira a descrição da imagem aqui

Agora com três elipses, como no exemplo de Maarten DHondt acima:

\documentclass{standalone}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}

color yellow; yellow = red+green;

def erase_and_fill expr pat = unfill pat; fill pat enddef;

path fig[];
fig1 = fullcircle xscaled 9cm yscaled 3cm shifted (4cm, 0) rotated 30; 
fig2 = fig1 rotated 120; 
fig3 = fig2 rotated 120; 

beginfig(1);
    for i = 1 upto 3: erase_and_fill fig[i] withcolor yellow; endfor
    erase_and_fill buildcycle(fig1, fig2) withcolor 0.7white;
    erase_and_fill buildcycle(fig2, fig3) withcolor green;
    erase_and_fill buildcycle(fig1, fig3) withcolor blue;
    erase_and_fill buildcycle(fig1, fig2, fig3) withcolor red; 
    for i = 1 upto 3: draw fig[i]; endfor
endfig;

\end{mplibcode}
\end{document}

insira a descrição da imagem aqui

informação relacionada