![在 Tikz 中绘制点对点通信模型](https://linux22.com/image/287382/%E5%9C%A8%20Tikz%20%E4%B8%AD%E7%BB%98%E5%88%B6%E7%82%B9%E5%AF%B9%E7%82%B9%E9%80%9A%E4%BF%A1%E6%A8%A1%E5%9E%8B.png)
我想在 Tikz 中绘制一幅说明点对点通信的图像。我以前曾根据以下方法相对轻松地绘制过流程图:简单流程图示例。
这是我想在 Tikz 中重新创建的图像:
我的困难是:
1.我不得不用流程图中的云朵代替火柴人。(这不是什么大问题,我可以接受)
2.如果我想在客户端 A 和 B 之间绘制 2 个箭头(边),结果将是一条双向路径(一条线,两端都有箭头),而不是两个单独的箭头。我真的想保留两个单独的箭头。
任何帮助都将受到赞赏。
答案1
首先要说的是:
\documentclass[border=2mm]{standalone}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{shapes.misc,shapes.geometric,shapes.symbols,positioning,shadings}
\begin{document}
\begin{tikzpicture}[font=\sffamily\footnotesize,
Kliens/.style={cloud,
cloud puffs=11,
cloud ignores aspect,
cloud puff arc=120,
draw,
minimum width=35mm,
minimum height=20mm,
draw=blue!50,
top color= white,
bottom color= blue!15,
align=center},
]
\node[Kliens] (K1) at (0,0) {Kliens A};
\node[Kliens, above right=2cm and 2cm of K1] (K2) {Kliens B};
\node[Kliens, below right=2cm and 2cm of K1] (K3) {Kliens C};
\draw[->] (K1.puff 1) -- (K2.puff 4) node[midway,above,sloped]{A input};
\draw[<-] (K1.puff 11) -- (K2.puff 5) node[midway,above,sloped]{B input};
\draw[->] (K1.puff 6) -- (K3.puff 4) node[midway,above,sloped]{A input};
\draw[<-] (K1.puff 7) -- (K3.puff 3) node[midway,above,sloped]{C input};
\draw[->] (K2.puff 6) -- (K3.puff 2) node[midway,above,sloped]{B input};
\draw[<-] (K2.puff 7) -- (K3.puff 1) node[midway,above,sloped]{C input};
\end{tikzpicture}
\end{document}
答案2
我的主要问题是,如果我想让 tikz 画 2线之间节点A 和 B,tikz 总是会画出节点间最短的连接线,因此这些线会重叠。最后我懒得画火柴人了。
我必须定义节点之间的连接角度。
我的最终解决方案:
\begin{figure}[!htb]
\centering
\begin{tikzpicture}[node distance = 2cm, auto]
% Place nodes
\node [cloud, fill=red] (KliensA) {\textit{A} Kliens};
\node [cloud, fill=green, right=5cm of KliensA] (KliensB) {\textit{B} Kliens};
\node [cloud, fill=orange, below=5cm of KliensA] (KliensC) {\textit{C} Kliens};
\node [cloud, fill=purple, below=5cm of KliensB] (KliensD) {\textit{D} Kliens};
% Draw edges
\path [line,red] (KliensA.60) -- node {A input} (KliensB.120);
\path [line,red] (KliensA.210) -- node[midway,above,sloped]{A input} (KliensC.150);
\path [line,red] (KliensA.0) -- node {A input} (KliensD.90);
\path [line,green] (KliensB) -- node {B input} (KliensA);
\path [line,green] (KliensB.270) -- node {B input} (KliensC.0);
\path [line,green] (KliensB) -- node[midway,below,sloped] {B input} (KliensD);
\path [line,orange] (KliensC) -- node[midway,below,sloped] {C input} (KliensA);
\path [line,orange] (KliensC.90) -- node {C input} (KliensB.180);
\path [line,orange] (KliensC) -- node {C input} (KliensD);
\path [line,purple] (KliensD.180) -- node {D input} (KliensA.270);
\path [line,purple] (KliensD.30) -- node[midway,above,sloped] {D input} (KliensB.330);
\path [line,purple] (KliensD.240) -- node {D input} (KliensC.300);
\end{tikzpicture}
\caption {Kommunikáció peer-to-peer modell esetén.}
\label{Peer2PeerFigure}
\end{figure}
输出: