Mit tikz habe ich drei Ellipsen gezeichnet, die sich überlappen. Wie kann die gesamte Schnittmenge gleichmäßig rot (nicht transparent) gefärbt werden? Mit Schnittmenge meine ich dabei den Bereich, in dem sich mindestens zwei Ellipsen überlappen. Die schwarzen Begrenzungslinien der einzelnen Ellipsen sollen aber sichtbar bleiben.

\documentclass[margin=5mm]{standalone}
\usepackage{tikz}

\newcommand\firstellipse{(0,-8) ellipse (6cm and 5cm)}
\newcommand\secondellipse{(7,-8cm) ellipse (6cm and 5cm)}
\newcommand\thirdellipse{(3.5,-4cm) ellipse (6cm and 5cm)}

\begin{document}
\begin{tikzpicture}
  \begin{scope}[fill opacity=0.4]
    \fill[green] \firstellipse;
    \fill[yellow] \secondellipse;
    \fill[blue] \thirdellipse;
  \end{scope}
  \begin{scope}[very thick,font=\large]
    \draw \firstellipse node at (-2,-8) {Ellipse A};
    \draw \secondellipse node at (3.5,-1) {Ellipse B};
    \draw \thirdellipse node at (9,-8) {Ellipse C};
  \end{scope}
  \node[font=\Large\bfseries] at (3.5,-7) {Schnittmenge};
\end{tikzpicture}

\end{document}

alt text

gefragt 08 Dez '13, 03:37

welle's gravatar image

welle
106222631
Akzeptiert-Rate: 0%

bearbeitet 08 Dez '13, 05:30

Benötigst du denn tatsächlich eine Transparenz im finalen Diagram? Ansonsten kann man das Problem vereinfachen in dem man einfach mit einer blasseren Farbe überpinselt. (fill opacity=.4 + red + weißer Grund = red!40)

(08 Dez '13, 04:53) Qrrbrbirlbel

@Qrrbrbirlbel Ich benötige keine Transparenz, d.h. zum Beispiel kann die erste Ellipse statt mit fill opacity=0.4 und green auch mit green!40 gezeichnet werden. Die rote Schnittmenge soll ohnehin nicht transparent sein. Die Teile der Ellipsen, die nicht zur Schnittmenge gehören, sollen aber ihre Farbe behalten.

(08 Dez '13, 05:07) welle

Unter der Annahme, dass du keine Transparenz im finalen Diagramm benötigst, kann der folgende Code verwendet werden ohne auf irgendwelche Tricks zurückzugreifen (die da wären: Inverser Clip, interne PGF-Makros (siehe auch TeX.sx) und Schnittstellen-Finderei, Bogen-Berechnungen, etc.).

Er verwendet grundsätzlich drei Schritte:

  1. Die einfachen Flächen werden zuerst mit ihrer Farbe gefüllt.
  2. Für jede Zweier-Kombination von Flächen werden beide Ellipsen geclipt, so dass im anschließenden Zwischenschritt nur die Schnittmenge dieser beiden Ellipsen gefüllt wird. (Der dafür verwendete Pfad ist relativ irrelevant, anstelle der Bounding Box hätten auch einfach nochmal die Ellipsen verwendet werden können.)
  3. Die Ellipsen werden ohne Füllung gezeichnet, im Gegensatz zum Beispiel aus der Frage habe ich jeder Ellipse in ihrer (unverblassten) Füllungsfarbe gezeichnet.
  4. Für die Bezeichnungen der Ellipsen habe ich die anfangs definierten Ellipsenmittelpunkte definiert.

Es sei darauf hingewiesen, dass ich Ellipsenradien sowie Ellipsenzentren einheitlich im Benutzer-Koordinatensystem (das ohne Einheiten) angegeben habe.

Der hier vorgeschlagene Lösungsweg kann nicht angewendet werden, wenn die gemeinsamen Schnittmengen mit einem gemeinsamen Shading oder einem gemeinsamen Fading ausgestattet werden soll. Ein Pattern allerdings würde sich ohne Phasenverschiebungen gerendert werden. Der in den meisten Pattern vorhandener transparenter Hintergrund würde allerdings diese Lösung genau zu nichtig erklären, wie die Abhängigkeit von Transparent und Schritt 1 müsste drastisch verändert werden oder die Schnittmengen-Fläche doch aufwändig ermittelt werden.

Code

\documentclass[tikz,margin=5mm]{standalone}
\begin{document}
\begin{tikzpicture}[very thick, x radius=6, y radius=5]
\coordinate (e1) at (0,-8)
 coordinate (e2) at (7,-8)
 coordinate (e3) at (3.5, -4);
% Schritt 1: Einfache Flächen einfärben
\foreach \col[count=\ca] in {green, yellow, blue}
  \fill[color=\col!40] (e\ca) ellipse[];
% Schritt 2: Schnittmengen mit mehr als zwei Ellipsen einfärben
\foreach \ca/\cb in {1/2, 2/3, 3/1} {
  \begin{scope}
    \clip (e\ca) ellipse[]; \clip (e\cb) ellipse[];
    \fill[red!40] (current bounding box.south west) rectangle
                  (current bounding box.north east);
  \end{scope}
}
% Schritt 3: Elippsen-Rand zeichnen
\foreach \col[count=\ca] in {green, yellow, blue}
  \draw[\col] (e\ca) ellipse[];
% Schritt 4: Bezeichnungen
\begin{scope}[very thick,font=\large]
  \node[below left]  at (e1) {Ellipse A};
  \node[above=+1cm]  at (e3) {Ellipse B};
  \node[below right] at (e2) {Ellipse C};
\end{scope}
\node[font=\Large\bfseries] at (barycentric cs:e1=1,e2=1,e3=1) {Schnittmenge};
\end{tikzpicture}
\end{document}

Output

alt text

Permanenter link

beantwortet 08 Dez '13, 05:18

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k2815
Akzeptiert-Rate: 53%

Uuh, die Definition der Ellipsen in der Reihenfolge first, third, second hat bei mir jetzt die Farben durcheinander geworfen (was man auch anhand der Reihenfolgen der Referenzen zu e1, e2 und e3 bei den Beschriftungen erkennen kann). Das wieder auszusortieren sollte aber eigentlich kein Problem darstellen, oder?

(08 Dez '13, 05:22) Qrrbrbirlbel

Ich hab die Ellipsendefinitionen in der Frage getauscht, dann passt das jetzt auch mit den Farben.

(08 Dez '13, 05:33) welle
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×728

gestellte Frage: 08 Dez '13, 03:37

Frage wurde gesehen: 10,739 Mal

zuletzt geändert: 08 Dez '13, 05:33