如何在 TikZ 中将一个节点相对于另一个节点以特定角度定位,同时考虑节点的大小?

如何在 TikZ 中将一个节点相对于另一个节点以特定角度定位,同时考虑节点的大小?

我问了一个问题之前关于如何在 TikZ 中以某个角度将一个节点相对于另一个节点定位,我得到的答案是您可以使用语法\path (node1) ++(angle:distance) node [styles] (node2) {};

然而,这里的距离只涉及中心两个节点的距离,而不是外边缘节点。为了说明这一点,请看下面的示例:

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{positioning}

\newdimen\nodeSize
\nodeSize=4mm
\newdimen\nodeDist
\nodeDist=6mm
\begin{document}
\begin{tikzpicture}[
    node/.style={%
      draw,
      circle,
      inner sep=0,
      outer sep=0,
      minimum size=\nodeSize,
      node distance=\nodeDist,
    },
  ]
  \node [node] (n1) {$n_1$};
  \node [node, below=of n1] (n2) {$n_2$};
  \path (n2) ++(-120:\nodeDist) node [node] (n3) {$n_3$};
  \path (n2) ++(- 60:\nodeDist) node [node] (n4) {$n_4$};

  \draw (n1) -- (n2);
  \draw (n2) -- (n3);
  \draw (n3) -- (n4);
  \draw (n4) -- (n2);
\end{tikzpicture}
\end{document}

在此处输入图片描述

当然,一个简单的解决方法是让距离成为\nodeDist和的总和\nodeSize,但我想知道是否有一些更为稳健的方法来做到这一点:

  1. 它使用的值node distance(因此不必处理 TikZ 外部的长度),并且
  2. 考虑节点的实际大小。

positioning理想情况下,如果能够启用与库所提供的方法类似的方法就好了-\node [position=60 degrees from node1] (node2) {};或者类似的东西。

答案1

你可以通过定义新的样式相对轻松地实现这样的目标

position/.style args={#1:#2 from #3}{
    at=(#3.#1), anchor=#1+180, shift=(#1:#2)
}

然后,您可以使用例如来指定节点之间的角度和分离position=-120:{\nodeDist} from n2

如果要使用 中设置的值node distance,则可以使用

\makeatletter
\tikzset{
    position/.style args={#1 degrees from #2}{
        at=(#2.#1), anchor=#1+180, shift=(#1:\tikz@node@distance)
    }
}
\makeatother

并使用调用样式position=120 degrees from n2

\documentclass{standalone}

\usepackage{tikz}
\usetikzlibrary{positioning}

\newdimen\nodeSize
\nodeSize=4mm
\newdimen\nodeDist
\nodeDist=6mm

\tikzset{
    position/.style args={#1:#2 from #3}{
        at=(#3.#1), anchor=#1+180, shift=(#1:#2)
    }
}

\begin{document}
\begin{tikzpicture}[
    node/.style={%
      draw,
      circle,
      inner sep=0,
      outer sep=0,
      minimum size=\nodeSize,
      node distance=\nodeDist,
    },
  ]
  \node [node] (n1) {$n_1$};
  \node [node, below=of n1] (n2) {$n_2$};
  \node [node, position=-120:{\nodeDist} from n2] (n3) {$n_3$};
  \node [node, position=-60:{\nodeDist} from n2] (n4) {$n_4$};

  \draw (n1) -- (n2);
  \draw (n2) -- (n3);
  \draw (n3) -- (n4);
  \draw (n4) -- (n2);
\end{tikzpicture}
\end{document}

相关内容