Как заставить Tikz нарисовать изогнутую стрелку от одного узла к другому, когда мои узлы находятся на прямой линии?

Как заставить Tikz нарисовать изогнутую стрелку от одного узла к другому, когда мои узлы находятся на прямой линии?

У меня есть этот код

\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}

который создает этот график:

плохой график

Моя цель — создать такой график:

хороший график

Извините за плохой рисунок. Я пробовал разные комбинации (4) edge node [bend left] {} (1);и (4) edge node [loop left] {} (1);все без толку.

решение1

Чтобы продемонстрировать другой подход, этот вариант использования — именно то, для чего были созданы ключи bend leftи :bend right

\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}

введите описание изображения здесь

Эти клавиши также принимают необязательное <angle>значение для одновременной симметричной установки клавиш inи out, поэтому запись

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

приведет к

введите описание изображения здесь

Если требуется асимметричная установка клавиш inи ,outрешение cfrэто верный путь.

решение2

Один из подходов — использовать \drawи указывать входящие и исходящие углы. Простое указание имен узлов построит путь относительно центра узла (хотя и не будет рисоваться оттуда). Вы также можете указать якоря узлов. Например, красная линия соединяется (4.north)с (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}

введите описание изображения здесь

решение3

Если вопрос в этом, то есть несколько способов рисовать кривые. Вот один из них:

\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}

кривая спина

Вот способ сделать его частью оригинала \path( edgeнемного изменив углы):

  \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);

край в кривых траектории

Связанный контент