Ich möchte mit TikZ als Bestandteil einer Grafik einen Kreisring zeichnen, also zwei konzentrische Kreise (gemeinsamer Mittelpunkt) und die eingeschlossene Fläche gefärbt. Was so kompliziert klingt, veranschaulicht besser ein Bildentwurf:

Kreisscheibe

Wie stelle ich das am besten an? Einen Pfad festlegen und füllen, oder gefüllte Kreise zeichnen, wobei der kleinere als zweiter gezeichnet wird und so den größeren überschreibt? Die Kreislinien selbst als Begrenzung sind nicht wichtig, die hatte ich im Mal-Programm gezeichnet, um den zu füllenden Bereich zu begrenzen, nur um die farbige Scheibe geht es eigentlich.

gefragt 23 Jul '13, 21:34

Felix's gravatar image

Felix
1.3k525667
Akzeptiert-Rate: 47%

bearbeitet 21 Jun '16, 17:45

saputello's gravatar image

saputello
11.1k174365


Dann wäre das einfachste wohl das hier.

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
  \begin{tikzpicture}
    \draw[yellow,line width=1cm] (0,0) circle[radius=2cm];
  \end{tikzpicture}
\end{document}

Die Details liest Du am besten in der Anleitung von »PGF/TikZ« nach.


Ergebnis

Permanenter link

beantwortet 23 Jul '13, 22:00

Thorsten's gravatar image

Thorsten
1.6k325
Akzeptiert-Rate: 58%

bearbeitet 17 Aug '13, 11:12

cgnieder's gravatar image

cgnieder
22.1k253463

Clever! Einfach eine dicke Kreislinie als Kreisscheibe, da kam ich nicht drauf. Da ich keine Randline brauche, erfüllt das den Zweck am einfachsten.

(23 Jul '13, 22:14) Felix

Was ist aber, wenn doch eine Linie am Rand der Fläche gezeichnet werden soll? Es folgt eine Lösung für beliebige Pfade, die geschnitten werden sollen. (In diesem Fall sind es nur zwei Kreise, die einen gemeinsamen Mittelpunkt haben.

Das Resultat von Thorsten’s Beispiel kann relativ einfach erstellt werden:

\begin{tikzpicture}[even odd rule]
  \fill[yellow] (0,0) circle[radius=2.5]
                      circle[radius=1.5];
\end{tikzpicture}

Die even odd rule sorgt dafür, dass eine zweifache (und damit gerade) Überlagerung von Flächen bewirkt, dass sie eben nicht gefüllt wird. Die Option kann selbstverständlich auch nur am Pfad angegeben sein.

Die Standard-Regel für Füllungen ist die nonzero rule, die die „Richtung“ von den Pfaden beachtet. Im obigen Fall (circles werden immer im mathematischen Sinne positiv, also gegen den Uhrzeigersinn, gezeichnet) würde das nur eine gemeinsame Fläche ergeben. Zeichnet man den Kreis allerdings mit dem Uhrzeigersinn (also negativ), kann man auch die nonzero rule verwenden:

\begin{tikzpicture}
  \fill[yellow] (0,0)   circle[radius=2.5]
                (0:1.5) arc   [radius=1.5, start angle=0, delta angle=-360];
\end{tikzpicture}

Zugegebenermaßen, in diesem einfachen Fall nicht sehr komfortabel, kann aber in anderen Fällen sicherlich hilfreich sein.
(Selbst das TikZ-Manual bezeichnet das Vorgehen der nonzero rule als „kompliziert“: „Sounds complicated? It is.“)

Beide TikZ-Pictures ergeben das linke Bild:

alt text       alt text

Fügt man dem Pfad noch ein nicht-none draw hinzu kann man auch die Ränder der Fläche zeichnen lassen. Mit dem Code

\begin{tikzpicture}[ultra thick, even odd rule]
  \path[fill=yellow,draw=blue] (0,0) circle[radius=2.5]
                                     circle[radius=1.5];
\end{tikzpicture}

lässt sich das zweite Bild von oben erstellen.

Möchte man die Begrenzungslinien allerdings in unterschiedlicher Farbe oder Art zeichnen, muss dies in einem separatem Pfad erfolgen. Damit man denselben Pfad nicht zweimal angeben muss (und somit Fehler und Aufwand bei Korrekturen verhindert), empfehle ich den Pfad mittels eines insert path-Styles zu speichern:

\begin{tikzpicture}[ultra thick, even odd rule]
  \path[fill=yellow] [saveuse path={aussenRing}{(0,0) circle[radius=2.5]}]
                     [saveuse path={innenRing} {      circle[radius=1.5]}];

  \draw[red]   [aussenRing];
  \draw[green] [innenRing];
\end{tikzpicture}

Man beachte, dass der saveuse path den benannten Style (hier aussenRing und innenRing) global definiert und somit womöglicherweise gleichnamige, gespeicherten Pfade aus einem höheren Scope überschreibt.

Referenz:

Gesamter Code

\documentclass[tikz,convert=false]{standalone}
\tikzset{
  saveuse path/.code 2 args={
    \pgfkeysalso{#1/.estyle={insert path={#2}}}%
    \global\expandafter\let\csname pgfk@\pgfkeyscurrentpath/.@cmd\expandafter\endcsname %
                           \csname pgfk@\pgfkeyscurrentpath/.@cmd\endcsname
    \pgfkeysalso{#1}%
  }
}
\begin{document}
  \begin{tikzpicture}[ultra thick, even odd rule]
    \path[fill=yellow] [saveuse path={aussenRing}{(0,0) circle[radius=2.5]}]
                       [saveuse path={innenRing} {      circle[radius=1.5]}];

    \draw[red]   [aussenRing];
    \draw[green] [innenRing];
  \end{tikzpicture}
  \begin{tikzpicture}[ultra thick, even odd rule]
    \path[fill=yellow,draw=blue] (0,0) circle[radius=2.5]
                                       circle[radius=1.5];
  \end{tikzpicture}
  \begin{tikzpicture}
    \fill[yellow] (0,0)   circle[radius=2.5]
                  (0:1.5) arc   [radius=1.5, start angle=0, delta angle=-360];
  \end{tikzpicture}
\end{document}

Ergebnis

alt text

Permanenter link

beantwortet 26 Jul '13, 04:32

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k3815
Akzeptiert-Rate: 53%

bearbeitet 17 Aug '13, 11:15

cgnieder's gravatar image

cgnieder
22.1k253463

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:

×731
×20
×12

gestellte Frage: 23 Jul '13, 21:34

Frage wurde gesehen: 28,078 Mal

zuletzt geändert: 21 Jun '16, 17:45