Hallo, ich würde gerne die Ecken eines Polygons so beschriften wie man sie auch auf dem Blatt Papier beschriftet, sprich "radial" außerhalb der Zeichnung (mit v_0, v_1, ..., v_(n-1) im Uhrzeigersinn wobei v_0 oben steht). Kann mir bitte jemand helfen? Ich muss später auch noch einige Winkel einfügen, deswegen dachte ich dass \node [draw, minimum size=3cm, regular polygon, regular polygon sides=9] at (0,0) {}; vielleicht nicht die beste Idee ist. Und Sorry für den komischen Quellcode, wäre nett wenn mir einer verraten könnte wieso der auf einmal nicht mehr schön angezeigt wird.

Open in Online-Editor
\documentclass[a4paper,11pt]{article}
\usepackage{tikz}
\begin{document}
\usetikzlibrary{shapes}
  \begin{figure}[H]

  \centering

  \begin{tikzpicture}

   \draw
         (0:0cm) coordinate (v0)
         -- ++(340:2cm) coordinate (v1)
         -- ++(300:2cm) coordinate (v2)
         -- ++(260:2cm) coordinate (v3)
         -- ++(220:2cm) coordinate (v4)
         -- ++(180:2cm) coordinate (v5)
         -- ++(140:2cm) coordinate (v6)
         -- ++(100:2cm) coordinate (v7)
         -- ++(60:2cm) coordinate (v8) -- cycle;
    \draw (v6)--(v3)--(v0)--cycle;
    \draw (v7)--(v2);
    \draw (v8)--(v1);

  \end{tikzpicture}

  \end{figure}

\end{document}

gefragt 18 Mai '15, 22:37

embeh's gravatar image

embeh
1473812
Akzeptiert-Rate: 0%

bearbeitet 03 Jun '15, 14:28

esdd's gravatar image

esdd
17.7k254256

Zum Formatieren des Codes brauchst Du diesen nur markieren und dann den Button mit den Nullen und Einsen oberhalb anzuklicken. Alternativ kannst Du auch Deinen gesamten Code um 4 Leerzeichen einrücken. Inlinecode wird mit Backticks formatiert. Siehe auch diese Erklärung von Clemens.

(19 Mai '15, 01:10) esdd

Für das reguläre Neuneck mit v_0 oben geht das mit

Open in Online-Editor
\foreach \i in {0,...,8}\node[anchor={270-\i*40},circle] at (v\i){$v_{\i}$};

Dabei werden die Randanker (border anchor) der Knoten verwendet, die jeweils einer Gradzahl entsprechen. Im folgenden Beispiel kommentiere ich die schwarzen Linien aus und füge dafür orange Linien vom Zentrum durch die Ecken ein.

Open in Online-Editor
\documentclass[margin=5pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \draw
    (0:0cm) coordinate (v0)
    -- ++(340:2cm) coordinate (v1)
    -- ++(300:2cm) coordinate (v2)
    -- ++(260:2cm) coordinate (v3)
    -- ++(220:2cm) coordinate (v4)
    -- ++(180:2cm) coordinate (v5)
    -- ++(140:2cm) coordinate (v6)
    -- ++(100:2cm) coordinate (v7)
    -- ++(60:2cm) coordinate (v8)
    -- cycle;
  %\draw (v6)--(v3)--(v0)--cycle;
  %\draw (v7)--(v2);
  %\draw (v8)--(v1);
% Beschriftung
  \foreach \i in {0,...,8}\node[anchor={270-\i*40},circle] at (v\i){$v_{\i}$};
% Linien vom Zentrum aus, nur zur Sichtbarmachung
  \coordinate(vM) at (-90:{1/sin(20)});% Zentrum
  \foreach \i in {0,...,8}
    \draw[orange](vM)--(v\i)--([turn=0]0:1em);% Strahlen
\end{tikzpicture}
\end{document}

alt text


Man kann aber auch die Anzahl der Ecken/Kanten und deren Länge in Makro speichern und den Rest berechnen lassen. Dann kann man deren Anzahl bzw. Länge schnell ändern. Im folgenden wird zum Beispiel ein regelmäßiges Siebeneck mit der Kantenlänge 3 gezeichnet:

Open in Online-Editor
\documentclass[margin=5pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  \def\laenge{3}
  \def\n{7}
  \pgfmathtruncatemacro\nme{\n-1}
  \pgfmathtruncatemacro\w{360/\n}
  \draw
    (0:0) coordinate (v0)
      foreach \i in {1,...,\nme}
        {--++(360+\w/2-\i*\w:\laenge) coordinate (v\i)}
      --cycle;
  \foreach \i in {0,...,\nme}\node[anchor={270-\i*\w},circle] at (v\i){$v_{\i}$};
%%
%% nur zur Sichtbarmachung
  \coordinate(vM) at (-90:{(\laenge/2)/sin(\w/2)});% Zentrum
  \foreach \i in {0,...,\nme}
    \draw[orange,very thin](vM)--(v\i)--([turn=0]0:1em);% Strahlen
\end{tikzpicture}
\end{document}

alt text

Permanenter link

beantwortet 19 Mai '15, 01:29

esdd's gravatar image

esdd
17.7k254256
Akzeptiert-Rate: 62%

bearbeitet 19 Mai '15, 01:35

Ich finde regular polygon eine gute Idee.

Da der Wert, der in /pgf/regular polygon sides gesetzt ist, nicht mehr verfügbar ist, nachdem die Node erstellt wurde (und damit auch nicht mehr in einem append after command), erstelle ich eine PGFmath-Funktion sidesofpolygon("<Name einer Node>"), der die Anzahl der Ecken/Kanten eines bekannten Polygons wieder zurückgibt:

Open in Online-Editor
\pgfmathdeclarefunction{sidesofpolygon}{1}{%
  \begingroup
    \def\pgfmathresult{0}%
    \pgfutil@ifundefined{pgf@sh@ns@#1}{}{% Existiert das Shape überhaupt?
      \edef\pgf@tempa{\csname pgf@sh@ns@#1\endcsname}%
      \def\pgf@tempb{regular polygon}% Und ist es ein regular polygon?
      \ifx\pgf@tempa\pgf@tempb
        \csname pgf@sh@ma@#1\endcsname
        \let\pgfmathresult\sides
      \fi}%
    \pgfmath@smuggleone\pgfmathresult
  \endgroup}
\makeatother

Im Fall, dass <Name einer Node> keine benannte Node ist oder die Node zwar existiert, aber kein regular polygon ist, so wird hier 0 zurückgegeben. Die " sind leider notwendig, damit PGFmath nicht versucht den Node-Namen auszuwerten.

Ein Style namens erste Ecke oben rotiert ein Shape nötigenfalls, sodass die erste Ecke (.corner 1), für uns die nullte, oben ist. Dies ist nur bei den Polygonen mit einer geraden Anzahl von Ecken nötig:

Open in Online-Editor
erste Ecke oben/.style={
  shape border rotate={ifthenelse(iseven(\pgfkeysvalueof{/pgf/regular polygon sides}),
    180/\pgfkeysvalueof{/pgf/regular polygon sides},0)}},

Die Styles markiere Ecken=<Variable> und markiere Winkel={<angle-Style>}{<Variable>} wird verwendet, um mithilfe von \foreach-Schleifen und etwas Mathematik die Ecken zu bezeichnen, sowie ein paar Winkel einzufügen. Mit den so definierten Macros \eckeDavor und \eckeDanach ließe sich auch ein Winkel am Polygon-Mittelpunkt markieren. Ein paar edges noch und so …

Code

Open in Online-Editor
\documentclass[tikz]{standalone}
\usetikzlibrary{shapes.geometric,angles}
\makeatletter
\pgfmathdeclarefunction{sidesofpolygon}{1}{%
  \begingroup
    \def\pgfmathresult{0}%
    \pgfutil@ifundefined{pgf@sh@ns@#1}{}{% Existiert das Shape überhaupt?
      \edef\pgf@tempa{\csname pgf@sh@ns@#1\endcsname}%
      \def\pgf@tempb{regular polygon}% Und ist es ein regular polygon?
      \ifx\pgf@tempa\pgf@tempb
        \csname pgf@sh@ma@#1\endcsname
        \let\pgfmathresult\sides
      \fi}%
    \pgfmath@smuggleone\pgfmathresult
  \endgroup}
\makeatother
\tikzset{
  erste Ecke oben/.style={
    shape border rotate={ifthenelse(iseven(\pgfkeysvalueof{/pgf/regular polygon sides}),
      180/\pgfkeysvalueof{/pgf/regular polygon sides},0)}},
  markiere Ecken/.style={
    append after command={
      [/utils/exec=%
        \pgfmathtruncatemacro\sides{sidesofpolygon("\tikzlastnode")}]
      \foreach \ecke[
        count=\zaehler from 0,
        evaluate={\subscr=int(mod(\sides-\zaehler,\sides));}
        ] in {1,...,\sides}{
        node[anchor=-90+\zaehler/\sides*360,markierte Ecke/.try] at(\tikzlastnode.corner \ecke)
        {$#1_{\subscr}$}
      }}},
  markiere Winkel/.style 2 args={
    append after command={
      [/utils/exec=%
        \pgfmathtruncatemacro\sides{sidesofpolygon("\tikzlastnode")}%
        \let\tikzLastNode\tikzlastnode]
      \foreach \ecke[
        count=\zaehler from 0,
        evaluate={
          \subscr    =int(mod(\sides-\zaehler,\sides));
          \eckeDavor =int(\zaehler==0?\sides:\zaehler);
          \eckeDanach=int(mod(\ecke,   \sides)+1);}
        ] in {1,...,\sides}{
         coordinate (@mW@A) at (\tikzLastNode.corner \eckeDavor)
         coordinate (@mW@B) at (\tikzLastNode.corner \ecke)
         coordinate (@mW@C) at (\tikzLastNode.corner \eckeDanach)
        pic[draw, #1, pic text options={scale=.75}, pic text={$#2_{\subscr}$}] {angle=@mW@C--@mW@B--@mW@A}
      }}},
}
\begin{document}
\foreach \i in {3,...,11}{%
\begin{tikzpicture}[markierte Ecke/.style={circle,inner sep=+0pt}]
\node[draw, minimum size=3cm, regular polygon, regular polygon sides=\i,
  erste Ecke oben, markiere Ecken=v,
  markiere Winkel={fill=gray!50, angle eccentricity=2,angle radius=+.2cm}{\varphi}] at (0,0) (a) {};
\end{tikzpicture}}
\end{document}

Output

alt textalt textalt text alt textalt textalt text alt textalt textalt text

Permanenter link

beantwortet 02 Jun '15, 20:25

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k2815
Akzeptiert-Rate: 53%

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: 18 Mai '15, 22:37

Frage wurde gesehen: 9,307 Mal

zuletzt geändert: 03 Jun '15, 14:28