tikz - 第二个位置的相对坐标

tikz - 第二个位置的相对坐标

我正在绘制一种序列图,但我不想计算每个位置。

我想使用相对坐标。使用命令coodinate我将第一个坐标 (0.25,14.25) 设置为a,但我想选择第二个坐标 (0.25,14.75)。

有没有办法做到这一点?

%Actor
\draw[dashed] (0.25,15) -- (0.25,0)  node[above=15] {User};
\draw[dashed] (6,15) -- (6,0)  node[above=15] {HMI};
\draw[dashed] (12,15) -- (12,0) node[above=15] {Server1};
\draw[dashed] (18,15) -- (18,0) node[above=15] {Server2};
%
%Blocks
\begin{scriptsize}
\draw[line width=5pt] (0.25,14.25) -- (0.25,14.75)  node[midway, right] {Test} coordinate (a);
\end{scriptsize}
%
%Arrows
\begin{scope}[>=latex]
\draw[->,black] (a) -- (6,14);
\end{scope}

答案1

您可以使用calc库来执行此操作(参见 pgf 手册的第 13.5 节坐标计算):

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}

\begin{tikzpicture}
  \coordinate (a) at (2,2);
  \coordinate (b) at (0,-2);
  \node[draw=red] at (a) {a};
  \node[draw=red] at (b) {b};
  \draw[help lines] (-1,-3) grid (3,3);
  \draw ($ (a) + (0,1) $) -- ($ (b) + (0,1) $);
\end{tikzpicture}
\end{document}

答案2

我觉得你有点搞混了。你的coordinate (a)(空节点)实际上是(0.25,14.75),位于路径的末尾。

要为路径的起点和终点设置一个“标记”,您可以执行以下操作:

    %Blocks
    \begin{scriptsize}
        \draw[line width=5pt] (0.25,14.25) coordinate(b) -- 
             (0.25,14.75)  node[midway, right] {Test} coordinate (a);
    \end{scriptsize}
    %
    %Arrows
    \begin{scope}[>=latex]
        \draw[->,black] (a) -- ++(1,0) node {a};
        \draw[->,black] (b) -- ++(1,0) node {b};
    \end{scope}

你将得到(部分图表):

结果部分截图

一般来说,你可以在路径的任何部分使用节点,使用pos键;如果你添加

        \draw[line width=5pt] (0.25,14.25) coordinate(b) -- 
           (0.25,14.75)  node[midway, right] {Test} 
           coordinate (a)  coordinate[pos=0.5](c);

       \draw[->,black] (c) -- ++(2,0) node {c};

你有:

在中间添加一个点

还要注意,midway键实际上是另一种说法pos=0.5

答案3

第一个答案:使用包tikz-uml,它还提供对序列图的支持。请参阅perso.ensta-paristech.fr/~kielbasi/tikzuml;序列图已记录这里

第二个答案:如果你想直接使用 tikz 命令自己做,我建议

  • 使用命令来设置常量,例如\xUser\xHmi来设置时间线的水平位置

  • 使用节点作为参与者和动作并命名它们

  • 为节点的参数定义样式。

然后,调整和扩展图表将变得容易。下面是操作方法的示例。

在此处输入图片描述

\documentclass[border=3pt]{standalone}
\usepackage{tikz}
\tikzset
  {actor/.style={font=\ttfamily},
   action/.style 2 args= % first arg is length in mm, second arg is label
     {minimum width=3mm,minimum height=#1mm,inner sep=0pt,
      draw,fill=blue!30,anchor=north,label={right:\scriptsize#2}
     },
   message/.style={-stealth,font=\scriptsize\bfseries},
   timeline/.style={dashed}
  }
\begin{document}
\begin{tikzpicture}[x=1mm,y=1mm]
  % horizontal position of actors (in mm)
  \newcommand\xUser{0}
  \newcommand\xHmi{20}
  \newcommand\xSa {40}
  \newcommand\xSb {60}
  % actors
  \node[actor] (user-0) at (\xUser,0) {User}; 
  \node[actor] (hmi-0)  at (\xHmi ,0) {HMI};
  \node[actor] (s1-0)   at (\xSa  ,0) {Server1};
  \node[actor] (s2-0)   at (\xSb  ,0) {Server2};
  % time lines
  \newcommand\yTimeMax{-65}
  \draw[timeline] (user-0) -- +(0,\yTimeMax); % example for relative positioning
  \draw[timeline] (hmi-0)  -- +(0,\yTimeMax);
  \draw[timeline] (s1-0)   -- +(0,\yTimeMax);
  \draw[timeline] (s2-0)   -- +(0,\yTimeMax);
  % actions (first arg is length in mm, second arg is label)
  \node[action={10}{$A_1$}] (user-1) at (\xUser,-10) {};
  \node[action={ 5}{$A_2$}] (hmi-1)  at (\xHmi ,-20) {};
  \node[action={15}{$A_3$}] (s1-1)   at (\xSa  ,-25) {};
  \node[action={10}{$A_4$}] (user-2) at (\xUser,-50) {};
  % messages
  \draw[message] (user-1.south east) -- node[above]{a} (hmi-1.north west);
  \draw[message] (hmi-1.south east)  -- node[above]{b} (s1-1.north west);
  \draw[message] (s1-1.south west)   -- node[above]{c} (user-2.north east);
\end{tikzpicture}
\end{document}

相关内容