TikZ 自动机中令人惊讶的节点定位

TikZ 自动机中令人惊讶的节点定位

以下代码(使用 TikZ 中的自动机库)

\documentclass[11pt]{article}

\usepackage{tikz,tkz-graph}
\usetikzlibrary{automata,positioning}


\begin{document}
    \begin{tikzpicture}
       \node[state] (p0) {$p_0$};
       \node[state] (p1) [right = of p0]{$p_1$};
       \node[state] (q) [above right = 1 and 0.5 of p0]{$q$};
    \end{tikzpicture}
 \end{document}

没有像我希望的那样将 q 节点定位在 p_0 和 p_1 的中点之上。

  1. 这是为什么?
  2. 我如何才能从 p_0 引用 q 获得所需的结果?

答案1

q获得状态相对于位置的期望位置p0并不简单。最简单的方法是按如下方式计算:

在此处输入图片描述

\documentclass[11pt]{article}
\usepackage{tikz}
\usetikzlibrary{automata,calc,positioning}

\begin{document}
\begin{tikzpicture}
   \node[state] (p0) {$p_0$};
   \node[state] (p1) [right= of p0]{$p_1$};
   \node[state] (q)  [above= of $(p0)!0.5!(p1)$]{$q$};
\end{tikzpicture}
\end{document}

编辑: 关于您的代码,它不能像(许多人)预期的那样工作。如果节点是矩形,则节点qright=0.5 cmp0.eastabove=1 cmp.north参见下图中带有蓝线的插图)。这与圆不同(参见下图中的红线)。在它被视为圆内矩形的坐标:

在此处输入图片描述

在上图中我已经考虑到,圆的距离必须更大

d - 2^{1/2}*d

在哪里d = 2r是圆直径:

    \documentclass[11pt]{article}
    \usepackage{tikz}
    \usetikzlibrary{automata,calc,positioning}

    \begin{document}
\begin{tikzpicture}[node distance=2cm and 2cm, 
     rect node/.style={draw, minimum size=1cm},
     dash node/.style={draw=red, densely dashed, minimum size=0.707cm},
   every state/.style={minimum size=1cm}
   ]
   \node[rect node] (p0) {$p_0$};
   \node[rect node] (p1) [right= of p0]{$p_1$};
   \node[rect node] (q)  [above right= 1cm and 1cm of p0]{$q$};
   \draw[thick,blue] (p0.45) -| ++ (1,1);
%
   \node[state] (p0) {$p_0$};
   \node[state] (p1) [right= of p0]{$p_1$};
   \node[state] (q)  [above right= 1.293 cm and 1.293 cm of p0]{$q$};
   \draw[thick,red]  (p0.45) -| ++ (1.293,1.293);
% rectangle inside circle
   \node[dash node] {};
   \node[dash node,above right= 1.293 cm and 1.293 cm of p0] {};
\end{tikzpicture}
    \end{document}

在上面的解释中,我没有考虑节点的中心位置q。了解节点中心的正确距离的确定q应该很简单。

但是,如果您按如下方式重新排列节点位置,则可以省略所有这些复杂性:

\begin{tikzpicture}(1,1);
   \node[state] (p0) {$p_0$};
   \node[state] (q)  [above right=of p0]{$q$};
   \node[state] (p1) [below right=of  q]{$p_1$};
\end{tikzpicture}

其结果与第一幅图所示非常相似:

在此处输入图片描述

希望现在我能回答你的问题:)

答案2

使用极坐标。

\documentclass[border=2mm]{standalone}
\usepackage{tikz}
\usetikzlibrary{automata}
\begin{document}
  \begin{tikzpicture}
    \node[state] (p0) at (210:1) {$p_0$};
    \node[state] (p1) at (330:1) {$p_1$};
    \node[state] (q)  at ( 90:1) {$q$};
  \end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容