我已经在 OpenOffice 中绘制了一些进程同步图,但我想要一个比这更优雅的解决方案。
我想要创建的是如下图所示的进程同步图。我浏览过texample.net,但找不到任何接近我想要做的事情。
有人可以与我分享他/她的智慧吗?
答案1
该calc
库帮助我们计算虚线所需的角度。
线上的点是预先定义的,因此我们可以简单地更改那里的值。例如,坐标p1-2
是相对于p1-1
的。p1-3
p1-2
坐标p23
是实线转换为弯曲虚线的点。
代码
\documentclass[tikz,convert=false]{standalone} % the standalone class is for this MWE
% \usepackage{tikz} % use an appropriate class in your document
\usetikzlibrary{calc}
\tikzset{
bar/.style={
insert path={+(180:#1) edge[-,line cap=rect] +(right:#1) + (0,0)}
},
bar/.default=2pt+1.5\pgflinewidth,% mimics the | arrow
curved/.style={
out=200,
in=160,
distance=+1cm
}
}
\begin{document}
\begin{tikzpicture}[y=-1cm, x=1.5cm, >=stealth]
\foreach \xValue in {1,2,3}
\draw[|-] (\xValue,0) -- ++(90:4) node[at start, above] {P\xValue};
\path (1, .5) coordinate (p1-1)
++ (0,1 ) coordinate (p1-2)
++ (0, .5) coordinate (p1-3)
(2,1 ) coordinate (p2-1)
(2,1.4) coordinate (p2-2)
(2,2.5) coordinate (p2-3)
(2.7,1.8) coordinate (p23)
(3,2.7) coordinate (p3-1)
(3,3 ) coordinate (p3-2)
;
\foreach \cStart/\cTarget in {p1-1/p2-1, p1-1/p3-1, p2-2/p1-3}
\path [->] (\cStart) [bar] edge (\cTarget) (\cTarget) [bar];
\foreach \lBase/\cStart/\cTarget in {p1/1/2, p2/2/3}
\path [->] (\lBase-\cStart) [bar] edge[curved] (\lBase-\cTarget) (\lBase-\cTarget) [bar];
\path let \p1=(p2-2),
\p2=(p23),
\n1={atan2(\x2-\x1,\y2-\y1)}
in (\p1) edge (\p2)
(\p2) edge [out=\n1, in=\n1-180, dashed,->] (p3-2) (p3-2) [bar];
\draw[<-] (.5,4) -- ++ (270:1) node[above] {temps};
\end{tikzpicture}
\end{document}