我想画出下面这个非常简单的图表。反馈线上不需要那些圆角。
我尝试遵循其他指南,但我不知道如何绘制反馈线,也不知道如何在矩形左侧垂直分布输入。
以下是我的尝试:
\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
为了尽可能多地重用原始代码,我做了以下两项更改:
- “虚拟”节点
feedback
现在below left
不再是below
- - 我再次将该虚拟节点与您的模型连接起来,但使用语法
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 实现的基本方法。我称其为基本方法,因为除了由包中的便捷快捷键boxes
(model.w
、model.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 格式中可用的同名宏,并进行了轻微修改,因为原始宏只能应用于循环。