使用 tikz 创建图表

使用 tikz 创建图表

我正在尝试在 latex 中创建下图: 在此处输入图片描述

以下是我的乳胶代码-

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows}

\begin{document}
\tikzset{
  box/.style    = {draw, rectangle, minimum height = 2.5em, minimum width = 2.5em},
  circl/.style  = {draw, circle,minimum size = 8mm},
  input/.style  = {coordinate},
  output/.style = {coordinate},
   to/.style    = {->,>=stealth',shorten >=1pt,semithick,font=\sffamily\footnotesize}
}

\begin{tikzpicture}[auto, node distance=2cm]
\node (in1) [input] {};
\node (cs) [box, right of=in1] {$C$};
\node (crc1) [circl, right of=cs]{};
\node (gs) [box, right of=crc1] {$G$};
\node (hs) [box, right of=gs] {$H$};
\node (ctl) [box, below of=hs] {Limiter};
\node (crc2) [circl, right of=hs]{};
\node (ze) [input, above of=crc2] {};
\node (ke) [box, right of=crc2] {$K$};
\node (fs) [output, right of=ke] {};

\draw [to] (in1) -- node {$f$}(cs);
\draw [to] (cs) -- (crc1);
\draw [to] (crc1) --(gs);
\draw [to] (gs) -- (hs);
\draw [to] (hs) -- node {$I_{max}$}(ctl);
\draw [to] (ctl) --node {$\theta$}(hs);
\draw [to] (hs) -- node {$z$}(crc2);
\draw [to] (ze) -- node {$C$}(crc2);
\draw [to] (crc2) --(ke);
\draw [to] (ke) -- node {$f(s)$}(fs);

\end{tikzpicture}

\end{document}

我无法从两个框中绘制底线和两个相反方向的箭头,这在上图中标记为红色。以下是 latex 生成的- 在此处输入图片描述

答案1

尝试这个

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{shapes.geometric, arrows}

\begin{document}
\tikzset{
  box/.style    = {draw, rectangle, minimum height = 2.5em, minimum width = 2.5em},
  circl/.style  = {draw, circle,minimum size = 8mm},
  input/.style  = {coordinate},
  output/.style = {coordinate},
   to/.style    = {->,>=stealth',shorten >=1pt,semithick,font=\sffamily\footnotesize}
}

\begin{tikzpicture}[auto, node distance=2cm]
\node (in1) [input] {};
\node (cs) [box, right of=in1] {$C$};
\node (crc1) [circl, right of=cs]{};
\node (gs) [box, right of=crc1] {$G$};
\node (hs) [box, right of=gs] {$H$};
\node (ctl) [box, below of=hs] {Limiter};
\node (crc2) [circl, right of=hs]{};
\node (ze) [input, above of=crc2] {};
\node (ke) [box, right of=crc2] {$K$};
\node (fs) [output, right of=ke] {};

\draw [to] (in1) -- node {$f$}(cs);
\draw [to] (cs) -- node[below left,pos=1]{+}(crc1) ;              % 1st modif
\draw [to] (crc1) --(gs);
\draw [to] (gs) -- (hs);
\draw [to] (hs.-70) -- node {$I_{max}$}(ctl.north-|hs.-70);       % 2st modif       
\draw [to] (ctl.north-|hs.-110) --node {$\theta$}(hs.-110);       % 3st modif
\draw [to] (hs) -- node {$z$}(crc2);
\draw [to] (ze) -- node {$C$}(crc2);
\draw [to] (crc2) --(ke);
\draw [to] (ke) -- node {$f(s)$}(fs)coordinate[pos=0.5](aa);     % 4 modif
\coordinate[below of =ctl,node distance=2em] (bb);
\draw[to] (aa) |- (bb) -| (crc1);

\end{tikzpicture}

\end{document}

您还可以尝试以下软件包:http://www.ctan.org/pkg/schemabloc 也在这里http://sciences-indus-cpge.papanicola.info/Schema-blocs-avec-PGF-TIKZ-sous

答案2

第一个问题:底线。

可以用如下代码来绘制:

\draw[to]  ($(ke)!.5!(fs)$) -- +(0,-3cm) -| (crc1);

让我解释一下:

  • ($(ke)!.5!(fs)$)用途插值坐标且要求。它指定坐标和之间的\usetikzlibrary{calc}中间点(部分) 。.5(ke)(fs)
  • --指定到下一个坐标的线,即
  • +(0,-3cm),这里+前面的表示这个坐标是相对于上一个坐标的,所以指定了上一个坐标下方3cm的一个点。
  • -|指定两条线,第一条线为水平线(从之前指定的点开始),第二条线为垂直线(结束于下一个坐标,即(crc1)

第二个问题:相反方向的箭头

每个节点都提供了“角度”锚点,这在这里很有用。语法(nodename.angle)表示一个锚点位于节点的边缘nodename,并且距离angle其中心。因此,例如(node.90)与相同(node.north)

您可以使用这些特殊锚点作为箭头的起点,例如,由于标有“限制器”的框是名为的节点(ctl),因此您可以使用(ctl.70)(ctl.110)作为这些线的锚点。

但是,您需要这些线是垂直的,因此我们有一个指定其最终坐标的问题。一旦您知道 tikz 允许语法作为坐标,表示放置在相同垂直和相同水平位置(a|-b)的坐标就很容易了。(a)(b)

使用这个想法,从 开始的线(ctl.70)应该在 结束(ctl.70|-hs.south),从 开始的线(ctl.110)应该在 结束(ctl.110|-hs.south),因此以下代码绘制了所需的箭头:

\draw [to] (ctl.70) -- node[right] {$I_{max}$} (ctl.70|-hs.south);
\draw [to] (ctl.110|-hs.south) --node[left] {$\theta$} (ctl.110);

得到的结果是:

结果

相关内容