如何用 Tikz 绘制这个简单的框图

如何用 Tikz 绘制这个简单的框图

我想画出下面这个非常简单的图表。反馈线上不需要那些圆角。

期望

我尝试遵循其他指南,但我不知道如何绘制反馈线,也不知道如何在矩形左侧垂直分布输入。

以下是我的尝试:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning}
\begin{document}

\tikzstyle{block} = [draw, rectangle, minimum height=3em, minimum width=3em]
\tikzstyle{virtual} = [coordinate]

\begin{tikzpicture}[auto, node distance=2cm]
    % Place nodes
    \node [virtual]                 (input)     {};
    \node [block, right of=input]   (model)     {Model};
    \node [virtual, right of=model] (output)    {};
    \node [virtual, below of=model] (feedback)  {};
    % Connect nodes
    \draw [->] (input) -- node {$u$} (model);
    \draw [->] (model) -- node [name=y] {$y$}(output);
    \draw [->] (y) |- (feedback);
\end{tikzpicture}

\end{document}

效果图如下:

在此处输入图片描述

您能指导我吗?谢谢

答案1

为了使从左侧进入的箭头与图像中一样,您可以用 指示准确位置(model.N),其中N是从锚点开始逆时针围绕形状的度数east。即,(model.90)将对应于(model.north)

rounded corners只需在中添加并从而不是\draw开始反馈线,即可获得圆角。(model)(y)

(input)您还可以相对于输入位置(此处为)定义的位置model.165,并且节点将直接位于该点的左侧。

最后,我将其设置(feedback)为左下方,(model.west)以便稍微收紧环路。

\documentclass[border=1mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning}
\begin{document}
\tikzstyle{block} = [draw, rectangle, minimum height=3em, minimum width=3em]
\tikzstyle{virtual} = [coordinate]
\begin{tikzpicture}[>=stealth,auto, node distance=2cm]
    % Place nodes
    \node [block] (model) {Model};
    \node [virtual, left=of model.165] (input)     {};
    \node [virtual, right=of model.0] (output)    {};
    \node [virtual, below left=of model.west] (feedback)  {};
    % Connect nodes
    \draw [->] (input) -- node {$u$} (model.165);
    \draw [->] (model) -- node [name=y] {$y$}(output);
    \draw [->,rounded corners] (model) -- (y.south) |- (feedback) |- (model.195);
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

为了尽可能多地重用原始代码,我做了以下两项更改:

  1. “虚拟”节点feedback现在below left不再是below-
  2. 我再次将该虚拟节点与您的模型连接起来,但使用语法node.angle指定终点,并使用路径|-来指定正交线。

所以:

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning}
\begin{document}

\tikzstyle{block} = [draw, rectangle, minimum height=3em, minimum width=3em]
\tikzstyle{virtual} = [coordinate]

\begin{tikzpicture}[auto, node distance=2cm]
    % Place nodes
    \node [virtual]                 (input)     {};
    \node [block, right of=input]   (model)     {Model};
    \node [virtual, right of=model] (output)    {};
    \node [virtual, below left of=model] (feedback)  {};
    % Connect nodes
    \draw [->] (input) -- node {$u$} (model);
    \draw [->] (model) -- node [name=y] {$y$}(output);
    \draw [->] (y) |- (feedback) |- (model.200);
\end{tikzpicture}

\end{document}

其结果为:

结果

答案3

如下图所示,您的问题的一部分在于您的feedback节点可能不在您想要的位置:它远低于您的模型。

在此处输入图片描述

这是通过以下方式生成的,当然您不希望feed它只是显示您的feedback节点的位置。我使用相对坐标绘制了您的反馈回路:++(a,b)添加(a,b)到最后一个坐标。

\documentclass[border=5mm,tikz]{standalone}
\usepackage{mwe}

\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning}
\begin{document}

\tikzstyle{block} = [draw, rectangle, minimum height=3em, minimum width=3em]
\tikzstyle{virtual} = [coordinate]

\begin{tikzpicture}[auto, node distance=2cm]
    % Place nodes
    \node [virtual]                 (input)     {};
    \node [block, right of=input]   (model)     {Model};
    \node [virtual, right of=model] (output)    {};
    \node [below of=model] (feedback)  {feed};
    % Connect nodes
    \draw [->] (input) -- node {$u$} (model);
    \draw [->] (model) -- node [name=y] {$y$}(output);
    \draw [->,rounded corners] (y)--++(0,-1.5)--++(-2.5,0)--++(0,1.0)--++(0.6,0);
\end{tikzpicture}

\end{document}

答案4

作为补充,这里有一个使用 MetaPost 实现的基本方法。我称其为基本方法,因为除了由包中的便捷快捷键boxesmodel.wmodel.e等)提供的框的基本点外,连接都是“手工制作的”。因此,这些连接的代码相对较长,但它提供了随意个性化的机会。使用 LuaLaTeX 排版。

\documentclass[border=2mm]{standalone}
\usepackage{luamplib}
\begin{document}
\begin{mplibcode}
  input boxes;
  numeric h, v; h = .7cm; v = 1.25cm;

  primarydef p cornered c =
    (point 0 of p --
    for i=1 upto length(p) -1 :
      (point i   of p) shifted (c*(unitvector(point i-1 of p - point i   of p))) 
      .. controls point i of p ..
      (point i of p) shifted (c*(unitvector(point i+1   of p - point i of p)))
      --
    endfor point length(p) of p)
  enddef ;

  beginfig(1);
    boxit.model(btex Model etex);
    model.dy = 3.5mm;
    drawboxed(model); 

    pair A, B, C, D, E, F; 
    A = model.e; F = .5[model.w, model.sw];
    B = A + (h, 0); C = (xpart B, -v);
    D = (xpart F - 2h, -v);
    E = (xpart D, ypart F);
    drawarrow (A--B--C--D--E--F) cornered 3mm;
    drawarrow B - (3mm, 0) -- B + (1.25h, 0);
    label.top(btex $y$ etex, B);

    pair G, H; H = model.w; G = model.w - (2.5h, 0);
    drawarrow G -- H;
    label.top(btex $u$ etex, .5[G,H]);
  endfig;
\end{mplibcode}
\end{document}

编辑我已经将主连接的角弄圆了,这要归功于一个cornered运算符。它取自 MetaPost 的 Metafun 格式中可用的同名宏,并进行了轻微修改,因为原始宏只能应用于循环。

在此处输入图片描述

相关内容