使用 TikZ 绘制计算机流程的示例

使用 TikZ 绘制计算机流程的示例

我需要将其作为 Tikz 绘图,但我无法执行后退和前进箭头 (1) 和 (2),总的来说,我完全不确定我在做什么。在此处输入图片描述

有人可以向我这个初学者展示如何正确地进行 Tikz 绘图吗?

答案1

为了好玩,练习并测试一些如何绘制平行箭头的想法:

\documentclass[tikz, margin=3mm]{standalone}
\usetikzlibrary{arrows.meta,
                calc, chains,
                positioning,
                quotes}

\begin{document}
\begin{tikzpicture}[
node distance = 12mm and 21mm,
  start chain = going right,
   box/.style = {rounded corners, draw, fill=green!30,
                 minimum width=9ex, minimum height=1em,
                 inner sep=1ex, on chain},
   tcs/.style = {transform canvas={yshift=#1}},
   every edge quotes/.style = {font=\footnotesize, inner sep=1pt, auto}
                    ]
\node (n1)  [box]   {bereit};
\node (n2)  [box]   {aktiv};
\node (n3)  [box]   {beendet};
\node (n4)  [box, below=of $(n1)!0.5!(n2)$]  {blockiert};
\draw[-Triangle]    (n1) edge ["(1)",tcs=+1mm] (n2) 
                    (n2) edge ["(2)",tcs=-1mm] (n1)
                    (n2) edge ["(5)"]  (n3)
                    (n2) edge ["(3)"]  (n4)
                    (n4) edge ["(5)"]  (n1);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

使用 TikZ graphdrawing

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{graphs,graphdrawing,quotes}
\usegdlibrary{force}
\begin{document}

\begin{tikzpicture}
  \graph[
  spring electrical layout,
  horizontal=bereit to beendet,
  node distance=3cm,
  nodes = {rounded corners,draw,fill=green!70!blue}
  ] {
    bereit ->[bend left,"(1)"] aktiv,
    aktiv ->[bend left,"(2)"] bereit,
    aktiv ->["(3)"] blockiert ->["(4)"] bereit,
    aktiv ->["(5)"] beendet
  };
\end{tikzpicture}

\end{document}

在此处输入图片描述

答案3

只是为了好玩,一些肮脏的技巧。我并不提倡用这种方式来编码这个特定的图形,但它们在其他情况下很有用。

  1. 使用矩阵而不是链或相对定位。为了将“blockiert”框放置在“bereit”和“aktiv”框的中间,避免它们之间有额外的间隙,所有这些节点都是类型的,因此它们不占用任何空间。因此,间距不取决于这些节点的大小,而是通过 中的和选项overlay固定。column seprow sep\matrix

  2. 由于节点大小为零,tikz 无法正确计算图形的边界框。通过使用fit库(以及none绘图颜色,使其保持不可见)“绘制”由所有其他节点组成的额外节点来解决此问题。

  3. 使用循环绘制所有箭头和数字。要获得平行箭头,诀窍是使用 形式的锚点nodename.number。数字被解释为一个角度,锚点位于节点形状与从节点中心投射的具有该角度的射线的交点处(例如:ber.5

所以代码是:

\documentclass[margin=2pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix, fit}

\tikzset{
 proc/.style={rectangle, rounded corners,
    draw=black!50, fill=green!20,
    inner sep=1pt, minimum height=0.7cm, minimum width=1.6cm,
    align=center, overlay
    }
}

\begin{document}
\begin{tikzpicture}
    \matrix (m) [matrix of nodes, every node/.style=proc, column sep=1.5cm, row sep=1.5cm] {
      |(ber)| bereit &                   & |(akt)| aktiv &      & |(bee)| beendet \\
                     & |(blo)| blockiert  \\
    };
    \foreach \start/\ending [count=\n] in  {ber.5/akt.175, akt.185/ber.-5, akt/blo, blo/ber, akt/bee}
    {
      \draw[-latex] (\start) -- (\ending) node[auto, midway, inner sep=1pt] {\scriptsize (\n)};
    }
    \node[fit=(ber) (blo) (bee), draw=none] {}; % Fix bounding box
\end{tikzpicture}
\end{document}

结果如下:

结果

答案4

明白了,我想:

\begin{tikzpicture}
[proc/.style={
    rectangle,
    draw=blue!50,
    fill=white,
    thick,
             inner sep=1pt,
    %minimum size=12mm,
    minimum height=0.5cm,
    minimum width=1.6cm,
    align=center
    }]
\node[proc]         (bereit)                    {bereit};
\node[proc]         (aktiv)     [right=of bereit]   {aktiv};
\node[proc]         (blockiert) [below right=0.5cm and -0.3cm of bereit]    {blockiert};
\node[proc]         (beendet)   [right=of aktiv]        {beendet};
\path   ([yshift=1mm]bereit.east)   edge        [->]        ([yshift=1mm]aktiv.west)
    ([yshift=-1mm]aktiv.west)   edge    [->]        ([yshift=-1mm]bereit.east)
    (aktiv)     edge    [->]        (beendet)
    (aktiv)     edge    [->]        (blockiert)
    (blockiert) edge    [->]        (bereit); 
\end{tikzpicture}

还有更好的办法吗?

相关内容