![如何在 TikZ 中将一个节点相对于另一个节点定位](https://linux22.com/image/238994/%E5%A6%82%E4%BD%95%E5%9C%A8%20TikZ%20%E4%B8%AD%E5%B0%86%E4%B8%80%E4%B8%AA%E8%8A%82%E7%82%B9%E7%9B%B8%E5%AF%B9%E4%BA%8E%E5%8F%A6%E4%B8%80%E4%B8%AA%E8%8A%82%E7%82%B9%E5%AE%9A%E4%BD%8D.png)
我想将节点“B”放置在任意节点“A”的 60 度角处,两者之间的距离为 2cm。如果节点“A”位于 (0, 0),我可以这样做,因此“B”与“A”的距离将是 (60 : 2),但如果“A”不在 (0, 0),会发生什么情况?
答案1
有多种方法可以做到这一点。其中一些需要calc
或positioning
TikZ 库(\usetikzlibrary{calc,positioning}
)。
最简单的方法是(使用calc
TikZ 库):
\node (A) at (2,4) {<content>};
\node (B) at ($ (A) + (60:2) $) {<content>};
您还可以使用坐标选项([<options>]<coordinate>)
来添加shift
选项,这不需要任何库但看起来有点奇怪。
\node (B) at ([shift={(60:2)}]A) {<content>};
答案2
使用 tikz 而不使用库的其他方法:
我更喜欢使用\path
而不是\draw
Marc 在评论中的建议。我们不会在路径上绘制任何东西。
第二种方法类似于 Martin 给出的一种可能性\node (B) at ([shift={(60:2)}]A) {<content>};
。我建议,([shift={(A)}] 60:2)
如果需要将其他节点相对于 A 放置,则最好这样做。如果我们放置其他点,我们可以添加另一种可能性,即使用范围环境。
\documentclass{scrartcl}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\path (2,4) node(A){content A} + (60:2) node(B){content B};
\end{tikzpicture}
\begin{tikzpicture}
\node (A) at (2,4) {content A};
\node(B) at ([shift={(A)}] 60:2) {content B};
\end{tikzpicture}
\begin{tikzpicture}
\node (A) at (2,4) {content A};
\begin{scope}[shift={(A)}]
\node (B) at ( 60:2) {content B};
\node (C) at ( -60:3) {content C};
\end{scope}
\end{tikzpicture}
\end{document}
答案3
通过 PSTricks,我知道有以下 6 种方法。
\documentclass[border=12pt]{standalone}
\usepackage{pst-node}
\psset{unit=0.5cm,saveNodeCoors}
\begin{document}
\begin{pspicture}[showgrid](4,4)
\pnode(2,2){A}
\pscircle(A){2}
\pnode[2;60](A){B}
\psdots(A)(B)
\end{pspicture}
\qquad
\begin{pspicture}[showgrid](4,4)
\pnode(2,2){A}
\pscircle(A){2}
\pnode([nodesep=2,angle=60]A){B}
\psdots(A)(B)
\end{pspicture}
\qquad
\begin{pspicture}[showgrid](4,4)
\pnode(2,2){A}
\pscircle(A){2}
\rput(A){\pnode(2;60){B}}
\psdots(A)(B)
\end{pspicture}
\qquad
\begin{pspicture}[showgrid](4,4)
\pnode(2,2){A}
\pscircle(A){2}
\nodexn{(A)+(2;60)}{B}
\psdots(A)(B)
\end{pspicture}
\qquad
\begin{pspicture}[showgrid](4,4)
\pnode(2,2){A}
\pscircle(A){2}
\pstVerb{/xyxyadd {3 2 roll add 3 1 roll add exch} bind def}%
\pnode(!2 60 PtoC N-A.x N-A.y xyxyadd){B}
\psdots(A)(B)
\end{pspicture}
\qquad
\begin{pspicture}[showgrid](4,4)
\pnode(2,2){A}
\pscircle(A){2}
\pstVerb{/xyxyadd {3 2 roll add 3 1 roll add exch} bind def}%
\curvepnode{60}{2 t PtoC N-A.x N-A.y xyxyadd}{B}
\psdots(A)(B)
\end{pspicture}
\end{document}
解释:
假设A
在 处有一个节点(2,2)
。为了便于阅读,我以A
为圆心,画一个半径为 2 的圆。
- 方法 1:
\pnode[2;60](A){B}
- 方法 2:
\pnode([nodesep=2,angle=60]A){B}
- 方法 3:
\rput(A){\pnode(2;60){B}}
- 方法 4:
\nodexn{(A)+(2;60)}{B}
方法 5:
\pstVerb{/xyxyadd {3 2 roll add 3 1 roll add exch} bind def}% \pnode(!2 60 PtoC N-A.x N-A.y xyxyadd){B}
方法 6:
\pstVerb{/xyxyadd {3 2 roll add 3 1 roll add exch} bind def}% \curvepnode{60}{2 t PtoC N-A.x N-A.y xyxyadd}{B}