如何在 TikZ 中将一个节点相对于另一个节点定位

如何在 TikZ 中将一个节点相对于另一个节点定位

我想将节点“B”放置在任意节点“A”的 60 度角处,两者之间的距离为 2cm。如果节点“A”位于 (0, 0),我可以这样做,因此“B”与“A”的距离将是 (60 : 2),但如果“A”不在 (0, 0),会发生什么情况?

答案1

有多种方法可以做到这一点。其中一些需要calcpositioningTikZ 库(\usetikzlibrary{calc,positioning})。

最简单的方法是(使用calcTikZ 库):

\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}
    

相关内容