Ich möchte gern eine Anzahl Knoten im Kreis um ein Zentrum positionieren. Für 4 Knoten habe ich einfach:

Open in Online-Editor
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[node distance=5em,every node/.style={circle,draw}]
  \node [circle] (Z) {Zentrum};
  \node [right=of Z] {1};
  \node [above=of Z] {2};
  \node [left=of Z]  {3};
  \node [below=of Z] {4};
\end{tikzpicture}
\end{document}

Jetzt möchte ich aber 10 Knoten im Kreis um das Zentrum herum setzen. Muss ich dafür die Koordinaten ausrechnen, oder wie kann man das hinkriegen optimalerweise in einer Schleife?

gefragt 16 Jul '13, 11:44

Felix's gravatar image

Felix
1.3k525666
Akzeptiert-Rate: 47%

bearbeitet 21 Jun '16, 17:42

saputello's gravatar image

saputello
11.1k174365

Wenn ich beim TikZ-Lernen und Grafiken-Erstellen auf Fragen stoße, stelle ich sie mal hier. Falls sie zu grundlegend sein sollten, gern ignorieren! Wenn ich es selber rauskriege mit dem dicken Handbuch, poste ich auch gern die gefundene Lösung. Am Ende haben dann hoffentlich auch andere als ich was davon, wenn sie auf solche Fragen stoßen.

(16 Jul '13, 11:47) Felix

Wenn die Kreise beschriftet werden soll, dann lässt sich das mit dem \foreach gleich mit erledigen:

\documentclass{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}[
  point/.style={circle,draw,minimum size=#1},
  point/.default=0pt % default Wert für minimum size bei point
]
  % mit count=\i werden die Kreise nummeriert
  % der zugehörige Winkel wird mit evaluate aus dieser Nummer berechnet
  % insgesamt werden (bis zu) 12 Kreise auf 360 Grad gleichmäßig verteilt
  \foreach[count=\i,evaluate=\i as \angle using (\i-1)*360/12] \text in {%
      1,2,iii,4,5,vi,7,8,ix,10,11,xii% Beschriftung der Kreise
    }
    \node[point=2.2em] (node\i) at (\angle:3) {\text};
\end{tikzpicture}

\end{document}

Kreise mit innerer Beschriftung

Permanenter link

beantwortet 16 Jul '13, 15:54

esdd's gravatar image

esdd
17.8k284257
Akzeptiert-Rate: 62%

bearbeitet 17 Aug '13, 11:17

cgnieder's gravatar image

cgnieder
22.1k253463

Beeindruckend! Soviel in einer Schleife erledigt! \foreach ist ja echt flexibel.

(16 Jul '13, 21:38) Felix

Das einfachste, was ich mir gerade vorstellen kann, wäre so was wie das hier.

\documentclass[11pt]{standalone}
\usepackage[T1]{fontenc}
\usepackage{tikz}

\begin{document}
    \begin{tikzpicture}[
      point/.style={
        circle,
        draw,
        fill=black,
        text=white,
      }
    ]
      \foreach \angle in {0,36,...,360}
        \node[point] (\angle) at (\angle:3) {};
    \end{tikzpicture}
\end{document}

Da gibt es sicher noch etwas elegantere Methoden.


Ergebnis

Permanenter link

beantwortet 16 Jul '13, 12:14

Thorsten's gravatar image

Thorsten
1.6k325
Akzeptiert-Rate: 58%

bearbeitet 17 Aug '13, 11:21

cgnieder's gravatar image

cgnieder
22.1k253463

Danke, die Lösung tut genau was sie soll, und ist leicht zu verstehen. Leichter als die Antwort, die ich als akzeptiert auswähle, weil ich mit der anderen gleich noch beschriften kann.

(16 Jul '13, 21:41) Felix

Die chains library, die auch die positioning library lädt, hält dafür eine interessante Lösung parat, die in vereinfachter Version als Beispiel auch im PGF/TikZ-Manual angegeben ist.

Der start chain-Key unterscheidet nämlich theoretisch vier mögliche Optionskombination.

Anstatt going kann man auch placed verwenden, das auch den ersten Node auf dem Chain beeinflust. Zusätzlicher wird in dem folgenden Text geprüft, ob ein Gleichheitszeichen = vorhanden ist. Ist dies der Fall, wird dieser Text wie er ist als Option für den Node verwendet, der on chain gesetzt wird. Hier haben wir Zugriff auch \tikzchaincount sowie den Node-Namen \tikzchainprevious.

Das einfache Beispiel aus dem Manual sie hier angegeben mit:

\begin{tikzpicture}[start chain=circle placed {at=(\tikzchaincount*30:1.5)}]
  \foreach \i in {1,...,10}
    \node [on chain] {\i};

  \draw (circle-1) -- (circle-10);
\end{tikzpicture}

Dieses Beispiel ergibt schon ein Ergebnis, das dem Geforderten ähnelt:

alt text

Führt man dies weiter, könnte man sich eine Option wie nodes around center vorstellen, die folgendermaßen definiert ist:

\tikzset{
  nodes around center/.style args={#1:#2:#3:#4}{%
    % #1 = Startwinkel
    % #2 = Anzahl Knoten
    % #3 = Zentrums-Node
    % #4 = Abstand
    at={([shift={(#3)}] {{(\tikzchaincount-1)*360/(#2)+#1}}:{#4})}
  }
}

Ein Chain, der mit start chain=circle placed {nodes around center=45:10:Z:5em}, auch circle genannt ist (dies hat nichts mit dem Shape zu tun), platziert nun die on chain=circle gesetzten Nodes startend bei 45° im Abstand von 5em um Z (also Z.center). Der radiale Abstand ist dabei 36°.

Nodes können auch ebenfalls mit einer \foreach-Schleife gesetzt werden, falls sie gemeinsame Eigenschaften haben. Ein vollständiges Beispiel:

\begin{tikzpicture}[node distance=5em,every node/.style={circle,draw}]
  \node [circle] (Z) {Zentrum};
  \begin{scope}[
    start chain=circle placed {nodes around center=45:10:Z:5em},
    every join/.append style={<->},
    every node/.append style={
      on chain=circle,
      join,
      minimum size=2em
      }
  ]
    \foreach \cnt in {0,...,5}
      \node[fill=black!\cnt 0!white] {\cnt};
    \node {6};        \node[rotate=180] {7};
    \node {$\infty$}; \node {9};
    \chainin (circle-begin);
  \end{scope}
\end{tikzpicture}

ergibt

alt text

Ein kleiner Unterschied besteht aber immer noch zwischen dieser Platzierung und einer mithilfe positioning. Der Abstand 5em ist gemessen zwischen den center-Anchors der Nodes. Sofern nicht die on grid-Option gesetzt ist, platziert positioning die Nodes so, dass der Abstand zwischen ihren Borders (die mit draw gezeichneten Linien (und genaugenommen gehört outer seps da auch noch dazu)) 5em beträgt.
Geht man davon aus, dass das Zentrum als benannte Node (das kann auch eine benannte coordinate sein) angegeben ist, kann man dieses Verhalten mit einer kleinen Variation an dem nodes around center-Style auch simulieren. (Ich habe dafür die rotate-Option bei der 7-Node entfernen müssen.) Bei gleicher Argumenten sieht die Definition von nodes around center* dann folgendermaßen aus:

\tikzset{
  nodes around center*/.style args={#1:#2:#3:#4}{% gleiche Optionen wie oben
    at={([shift={(#3.{(\tikzchaincount-1)*360/(#2)+#1})}] {{(\tikzchaincount-1)*360/(#2)+#1}}:{#4})},
    anchor={(\tikzchaincount-1)*360/(#2)+#1+180}
  }
}

und ergibt dann mit dem Startwinkel 180

alt text

Kompletter Code

\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{chains}
\tikzset{
  nodes around center/.style args={#1:#2:#3:#4}{%
    % #1 = Startwinkel,   #2 = Anzahl Knoten
    % #3 = Zentrums-Node, #4 = Abstand
    at={([shift={(#3)}] {{(\tikzchaincount-1)*360/(#2)+#1}}:{#4})}
  },
  nodes around center*/.style args={#1:#2:#3:#4}{% gleiche Optionen wie oben
    at={([shift={(#3.{(\tikzchaincount-1)*360/(#2)+#1})}] {{(\tikzchaincount-1)*360/(#2)+#1}}:{#4})},
    anchor={(\tikzchaincount-1)*360/(#2)+#1+180}
  }
}
\begin{document}
\begin{tikzpicture}[node distance=5em,every node/.style={circle,draw}]
  \node [circle] (Z) {Zentrum};
  \begin{scope}[
    start chain=circle placed {nodes around center=45:10:Z:5em},
    every join/.append style={<->},
    every node/.append style={
      on chain=circle,
      join,
      minimum size=2em
      }
  ]
    \foreach \cnt in {0,...,5}
      \node[fill=black!\cnt 0!white] {\cnt};
    \node {6};        \node[rotate=180] {7};
    \node {$\infty$}; \node {9};
    \chainin (circle-begin);
  \end{scope}
\end{tikzpicture}
\begin{tikzpicture}[node distance=5em,every node/.style={circle,draw}]
  \node [circle] (Z) {Zentrum};
  \begin{scope}[
    start chain=circle placed {nodes around center*=180:10:Z:5em},
    every join/.append style={<->},
    every node/.append style={
      on chain=circle,
      join,
      minimum size=2em
      }
  ]
    \foreach \cnt in {0,...,5}
      \node[fill=black!\cnt 0!white] {\cnt};
    \node {6};        \node {7};
    \node {$\infty$}; \node {9};
    \chainin (circle-begin);
  \end{scope}
\end{tikzpicture}
\end{document}
Permanenter link

beantwortet 26 Jul '13, 05:43

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k3815
Akzeptiert-Rate: 53%

bearbeitet 17 Aug '13, 11:20

cgnieder's gravatar image

cgnieder
22.1k253463

Sollte der Abstand (hier das letzte Argument, die 5em) automatisch von der angegebenen node distance stammen, ist etwas mehr Arbeit nötig; es ist aber ohne Problem machbar.

(26 Jul '13, 07:51) Qrrbrbirlbel
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:

×730
×76
×41
×21
×20

gestellte Frage: 16 Jul '13, 11:44

Frage wurde gesehen: 23,130 Mal

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