¿Dibujar elipses con diferentes colores para su intersección en tikz?

¿Dibujar elipses con diferentes colores para su intersección en tikz?

¿Cómo coloreo la intersección de dos elipses en diferentes colores? Por ejemplo, las elipses deberían estar coloreadas en amarillo y su intersección en rojo. Mi código para dibujar elipses se proporciona a continuación.

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

ACTUALIZACIÓN: En los comentarios a las respuestas individuales, solicité mostrarlo en tres elipses.

Respuesta1

Como puedes ver enestosejemplos y enCómo dibujar diagramas de Venn (especialmente: complementos) en LaTeX, es bastante fácil dibujar tales elipses siempre que uno de los colores de relleno sea blanco.

Cuando quieras 2 colores de relleno diferentes y utilices los métodos descritos en los ejemplos anteriores, asegúrate de rellenar la elipse primero y dibujarlas después:

\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}

ingrese la descripción de la imagen aquí

EDITAR:en respuesta a su solicitud de comentario de tres elipses

La idea sigue siendo la misma:

  1. llena tus elipses
  2. llena tus intersecciones
  3. dibuja tus elipses

Entonces esto te da:

\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}

ingrese la descripción de la imagen aquí

Si quieres que todas las intersecciones sean rojas, cambia los colores azul, verde y gris a rojo.

Si quieres elipses rotadas usa

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

Respuesta2

Otra opción con \tikzfillbetweencomando desde pgfplot's fillbetweenla biblioteca.

\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}

ingrese la descripción de la imagen aquí

Respuesta3

Primero puedes rellenar una elipse con color rojo y dibujar (con relleno) dos 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}

ingrese la descripción de la imagen aquí

Respuesta4

He aquí un intento conMetapublicación(incluido en un programa LuaLaTeX), para aquellos que estén interesados ​​en él.

Tenga en cuenta que tampoco es sencillo dibujar este tipo de intersección con MetaPost. Si observa la definición de la primera elipse en el programa siguiente,

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

Entonces nota la rotated 90pieza. Parece extraño ya que significa que se aplica una rotación a un círculo, pero si suprimes esta parte,nadafuncionaría en absoluto. La explicación está dentro de los entresijos de la buildcyclemacro de MetaPost (la misma queAsíntota's, por cierto), que fueron discutidos en detalleen este tema.

ACTUALIZARDado que la segunda elipse ahora está definida de una manera diferente que antes (es decir, ahora girando la primera), hace rotated 90innecesaria la parte en la definición de la primera elipse. He simplificado el código en consecuencia. Aún así, es bueno tener en cuenta la limitación de la buildcyclemacro al abordar este tipo de tareas.

\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}

ingrese la descripción de la imagen aquí

Ahora con tres elipses, como en el ejemplo anterior de Maarten DHondt:

\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}

ingrese la descripción de la imagen aquí

información relacionada