我问了一个问题之前关于如何在 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
,但我想知道是否有一些更为稳健的方法来做到这一点:
- 它使用的值
node distance
(因此不必处理 TikZ 外部的长度),并且 - 考虑节点的实际大小。
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}