Wie bringe ich Tikz dazu, einen gekrümmten Pfeil von einem Knoten zum anderen zu erstellen, wenn meine Knoten auf einer geraden Linie liegen?

Wie bringe ich Tikz dazu, einen gekrümmten Pfeil von einem Knoten zum anderen zu erstellen, wenn meine Knoten auf einer geraden Linie liegen?

Ich habe diesen Code

\documentclass[10pt]{article}

\usepackage{tikz}
\usetikzlibrary{arrows}

\begin{document}

\begin{tikzpicture}[->,>=stealth',auto,node distance=3cm,
  thick,main node/.style={circle,draw,font=\sffamily\Large\bfseries}]

  \node[main node] (1) {a};
  \node[main node] (2) [right of=1] {b};
  \node[main node] (3) [right of=2] {c};
  \node[main node] (4) [right of=3] {d};

  \path[every node/.style={font=\sffamily\small}]
    (1) edge node [right] {} (2)
    (2) edge node [right] {} (3)
    (3) edge node [right] {} (4)
    (4) edge node [left] {} (1);
\end{tikzpicture}
\end{document}

das erzeugt diese Grafik:

schlechtes Diagramm

Mein Ziel ist es, ein Diagramm wie dieses zu erstellen:

gute Grafik

Entschuldigen Sie die schlechte Zeichnung. Ich habe verschiedene Kombinationen von (4) edge node [bend left] {} (1);und (4) edge node [loop left] {} (1);ohne Erfolg ausprobiert.

Antwort1

Um einen anderen Ansatz zu zeigen: Dieser Anwendungsfall ist genau das, wofür die Schlüssel bend leftund bend righterstellt wurden:

\documentclass[10pt]{article}

\usepackage{tikz}
\usetikzlibrary{arrows}

\begin{document}

\begin{tikzpicture}[->,>=stealth',auto,node distance=3cm,
  thick,main node/.style={circle,draw,font=\sffamily\Large\bfseries}]

  \node[main node] (1) {a};
  \node[main node] (2) [right of=1] {b};
  \node[main node] (3) [right of=2] {c};
  \node[main node] (4) [right of=3] {d};

  \path[every node/.style={font=\sffamily\small}]
    (1) edge node [right] {} (2)
    (2) edge node [right] {} (3)
    (3) edge node [right] {} (4)
    (4) edge[bend right] node [left] {} (1);
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Diese Tasten akzeptieren auch einen optionalen <angle>Wert, um die Tasten inund gleichzeitig outsymmetrisch zu setzen, so dass das Schreiben

(4) edge[bend right=90] node [left] {} (1);

wird darin enden, dass

Bildbeschreibung hier eingeben

Wenn eine asymmetrische Anordnung der Tasten inund outerforderlich ist,CFR-Lösungist der richtige Weg.

Antwort2

Ein Ansatz besteht darin, \drawdie eingehenden und ausgehenden Winkel zu verwenden und anzugeben. Durch einfaches Angeben der Knotennamen wird der Pfad in Bezug auf den Knotenmittelpunkt erstellt (obwohl nicht von dort aus gezeichnet wird). Sie können auch Knotenanker angeben. Beispielsweise verbindet die rote Linie (4.north)mit (1.north).

\documentclass[10pt]{article}
\usepackage{tikz}
\usetikzlibrary{arrows}

\begin{document}
\begin{tikzpicture}[->,>=stealth',auto,node distance=3cm,
  thick,main node/.style={circle,draw,font=\sffamily\Large\bfseries}]
\node[main node] (1) {a};
\node[main node] (2) [right of=1] {b};
\node[main node] (3) [right of=2] {c};
\node[main node] (4) [right of=3] {d};

\draw [->] (1) -- (2);
\draw [->] (2) -- (3);
\draw [->] (3) -- (4);
\draw [->] (4) to [out=150,in=30] (1);
\draw [->,red] (4.north) to [out=150,in=30] (1.north);
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort3

Es gibt mehrere Möglichkeiten, Kurven zu zeichnen, falls das die Frage ist. Hier ist eine:

\documentclass[tikz]{standalone}

\usetikzlibrary{arrows}

\begin{document}

\begin{tikzpicture}
  [
    ->,
    >=stealth',
    auto,node distance=3cm,
    thick,
    main node/.style={circle, draw, font=\sffamily\Large\bfseries}
    ]

  \node[main node] (1) {a};
  \node[main node] (2) [right of=1] {b};
  \node[main node] (3) [right of=2] {c};
  \node[main node] (4) [right of=3] {d};

  \path[every node/.style={font=\sffamily\small}]
    (1) edge node [right] {} (2)
    (2) edge node [right] {} (3)
    (3) edge node [right] {} (4);
  \draw
    (4) [out=150, in=20] to  (1);
\end{tikzpicture}
\end{document}

Kurve zurück

So können Sie es zu einem Teil des Originals machen \path( edgeindem Sie die Winkel ein wenig variieren):

  \path[every node/.style={font=\sffamily\small}]
    (1) edge node [right] {} (2)
    (2) edge node [right] {} (3)
    (3) edge node [right] {} (4)
    (4) edge [out=150, in=90]  (1);

Kante in Pfadkurven

verwandte Informationen