如何绘制从节点 3 到节点 1 的返回箭头

如何绘制从节点 3 到节点 1 的返回箭头

假设我有一个绘制流程图的代码,我现在想要一个从节点 3 到节点 1 的箭头,我该怎么做?

1<--|
|   |
2   |
|   |
3----

平均能量损失

\documentclass[class=article,border=0pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes,arrows}

% Define block styles
\tikzset{
    block/.style={rectangle, draw, line width=0.5mm, black, text width=5em, text centered,
                  rounded corners, minimum height=2em},
    line/.style={draw, -latex}
}% <- if you insist in using this in the document add this % here.
\begin{document}
\begin{tikzpicture}[node distance = 1cm, auto]
    % Place nodes
    \node [block] (BLOCK1) {a};
    \node [block, below of=BLOCK1] (BLOCK2) {b};
    \node [block, below of=BLOCK2, node distance=1cm] (BLOCK3) {c};
    % Draw edges
    \path [line] (BLOCK1) -- (BLOCK2);
    \path [line] (BLOCK2) -- (BLOCK3);
\end{tikzpicture}
\end{document}

答案1

您只需添加一行即可:

\path [line] (BLOCK3) --++ (2cm,0cm) |- (BLOCK1);

此路径从BLOCK3节点开始。然后它移动--到 ( ) 具有坐标的点(2cm,0cm) 相对的到该点;因此其中一个+s。第二个+将结果点作为新的参考点。如果没有它,路径的下一部分仍将“从”绘制BLOCK3

下一个路径描述|-绘制一条直角路径(先垂直,然后水平)到BLOCK1。如果我们改用,-|它将先水平,然后垂直。并不是您想要的;我只是为了清楚起见才将其包括在内。

输出

答案2

A此答案的先前版本解释了paths.ortho图书馆在pgf在 GitHub 上的仓库。图书馆现在是我的一部分tikz-ext包裹应该使用它(并且有一个适当的手册)。

图书馆ext.paths.ortho提供

  • 路径操作r-udr-rl和,r-du它们r-lr可以像---|例如 和
  • udlr distance以及每个运算符的一个<operator> distance,用于设置线的中间部分和最近节点之间的距离。

|-此外,节点/坐标可以放置在任何位置。与和运算符类似-|,角点位于0.250.75;这可以设置为和1/<n>,即使用将角设置在和。默认值为。(<n>-1)/<n>pacing=<n>spacing=30.33330.66674

还有布尔值,分别设置和处only middle的角点。01

更多解释见我的答案pgf-tikz 中的垂直线和水平线


在您的示例中,加载库后您需要做的就是

\path [line] (BLOCK3) r-rl (BLOCK1);

代码

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning, ext.paths.ortho}
\tikzset{
  block/.style={rectangle,draw,minimum size=1cm},
  line/.style={draw, -latex},
}
\begin{document}
\begin{tikzpicture}[node distance = 1cm, auto]
% Place nodes
\node [block]                                         (BLOCK1) {a};
\node [block, below=    of BLOCK1]                    (BLOCK2) {b};
\node [block, below=2cm of BLOCK2, node distance=1cm] (BLOCK3) {c};
% Draw edges
\path [line] (BLOCK1) -- (BLOCK2);
\path [line] (BLOCK2) -- (BLOCK3);
\path [line] (BLOCK3) r-rl (BLOCK1);
\end{tikzpicture}
\begin{tikzpicture}[
  node distance = 1cm,
  /utils/temp/.style={#1/.style={to path={r-#1(\tikztotarget)\tikztonodes}}},
  /utils/temp/.list={ud, rl, du, lr}]
\node [block]             (a) {a};
\node [block, below=of a] (b) {b};
\node [block, right=of a] (c) {c};
\node [block, below=of c] (d) {d};

\path[line, very thick] (a) edge[ud] (c)
                        (c) edge[rl] (d)
                        (d) edge[du] (b)
                        (b) edge[lr] (a);

\path[line, green, thick, ortho/udlr distance=0.25cm] (a) edge[du] (c)
                                                      (c) edge[lr] (d)
                                                      (d) edge[ud] (b)
                                                      (b) edge[rl] (a);

\draw[red] (a) r-ud (c) r-rl (d) r-du (b) r-lr (a);
\end{tikzpicture}
\end{document}

输出 1

在此处输入图片描述 在此处输入图片描述

答案3

其中一种方法是访问east锚点,在那里应用xshift并绘制形式:

在此处输入图片描述

笔记:

  • 根据 Matthew Leingang 的回答,也有语法|-,但我总是必须查找或反复试验才能正确。

代码:

\documentclass[class=article,border=2pt]{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes,arrows}

% Define block styles
\tikzset{
    block/.style={rectangle, draw, line width=0.5mm, black, text width=5em, text centered,                 rounded corners, minimum height=2em},
    line/.style={draw, -latex}
}% <- if you insist in using this in the document add this % here.
\begin{document}
\begin{tikzpicture}[node distance = 1cm, auto]
    % Place nodes
    \node [block] (BLOCK1) {a};
    \node [block, below of=BLOCK1] (BLOCK2) {b};
    \node [block, below of=BLOCK2, node distance=1cm] (BLOCK3) {c};
    % Draw edges
    \path [line] (BLOCK1) -- (BLOCK2);
    \path [line] (BLOCK2) -- (BLOCK3);

\path [line, red, thick] (BLOCK3.east) --
    ([xshift=0.5cm]BLOCK3.east) --
    ([xshift=0.5cm]BLOCK1.east) --
    (BLOCK1.east);
\end{tikzpicture}
\end{document}

答案4

PSTricks 解决方案:

\documentclass{article}

\usepackage{multido}
\usepackage{pstricks}
\usepackage{xfp}

% horizontal width of ``back to start'' arrow
\def\arrow{1}

% \diagram[<box width>,<box height>](<number of boxes>){<box separation>}
\def\diagram[#1,#2](#3)#4{%
\begin{pspicture}(\fpeval{#1+\arrow},\fpeval{#3*#2+(#3-1)*#4})
  \multido{\rA = 0+\fpeval{#2+#4},
           \rB = \fpeval{#2/2}+\fpeval{#2+#4},
           \i = #3+-1}{#3}{%
    \psframe[framearc = 0.3](0,\rA)(#1,\fpeval{\rA+#2})
    \rput(\fpeval{#1/2},\rB){$\i$}}
  \multido{\r = #2+\fpeval{#2+#4}}{\fpeval{#3-1}}{%
    \psline{<-}(\fpeval{#1/2},\r)(\fpeval{#1/2},\fpeval{\r+#4})}
  \psline{->}%
    (#1,\fpeval{#2/2})%
    (\fpeval{#1+\arrow},\fpeval{#2/2})%
    (\fpeval{#1+\arrow},\fpeval{(#3-0.5)*#2+(#3-1)*#4})%
    (#1,\fpeval{(#3-0.5)*#2+(#3-1)*#4})
\end{pspicture}}

\begin{document}

\diagram[2.2,1](4){0.5} \qquad
\diagram[1.5,2](3){0.3} \qquad
\diagram[2.5,1](5){0.7}

\end{document}

输出

相关内容