tikz 曲线以标记节点作为起点和终点

tikz 曲线以标记节点作为起点和终点

这些天,我正在使用 排版很多树(图论意义上的)pst-jtree,它本质上是 上的宏集合pstricks。因此,我可能有以下内容。

\jtree
   \! = {A}! .
   \! = <left>[xunit=5em]{B}!b ^<right>[xunit=5em]{E}!c .
   \!b = : {m} {C} : {n} {D} : {o} {p} .
   \!c = : {q} {F} : {r} {G} : {s} {t} .
\endjtree

在此处输入图片描述

这些是简单的情况。有时我需要在相距一定距离的节点之间绘制一个顶点。我通常使用 来做到这一点\nccurve,这很巧妙,因为我可以使用@标签(或\rnode)来定义贝塞尔曲线的起点和终点,然后使用 、 和 来对其angleA进行angleB操作ncurv

\jtree
   \! = {A}! .
   \! = <left>[xunit=5em]{B}!b ^<right>[xunit=5em]{E}!c .
   \!b = : {m} {C} : {n} {D}@D !d .
   \!c = : {q} {F} : {r} {G} : {s} {t}@t .
   \!d = <left>{o} .
\endjtree
\nccurve[angleA=-45,angleB=90,ncurvA=1.2,ncurvB=1.6]{-}{D:b}{t:t}

在此处输入图片描述

然而,当树达到一定复杂程度时,我希望对曲线有比我能得到的更多的控制\nccurve(例如,\nccurve有时我必须在穿过节点标签的曲线(呃)或具有非常紧密和长弧的曲线(呃再次)之间进行选择)。

对我来说,显而易见的解决方案是tikz定义一组 n 个点,然后让它在其上绘制一条平滑的曲线。

\begin{tikzpicture}
   \draw plot [smooth,tension=1] coordinates { (0,0) (1,1) (2,-2) (3,0)};
\end{tikzpicture}

在此处输入图片描述

但是,我不知道如何将这两种策略结合起来。主要问题是(据我所知)\draw需要我定义(x,y)坐标,而不是引用@\rnode标签。有办法解决这个问题吗?具体来说,我希望能够编写类似

\begin{tikzpicture}
    \draw plot [smooth,tension=1] coordinates { (D:b) (1,1) (2,-2) (t:t)};
\end{tikzpicture}

这个想法是,将(0,0)设置为标签的底部D(t:t)设置(x,y)相对于的任意坐标(0,0),然后(1,1)(2,-2)相对于设置(0,0),像往常一样。

答案1

如果使用forest,您可以通过将其指定为树的一部分来绘制曲线。在这里,我使用当前节点的父锚点 ( (.parent anchor)) 作为 的值,shift以便可以相对于该锚点指定绘图的坐标。然后,我使用命名节点的子锚点t( (t.child anchor)) 来指定曲线的终点。

\documentclass[tikz,border=20pt]{standalone}
\usepackage{forest}
\begin{document}
\newlength\myex
\settoheight{\myex}{X}
\begin{forest}
  for tree={
    parent anchor=south,
    child anchor=north,
    anchor=mid,
    text height=\myex,
    tier/.wrap pgfmath arg={tier #1}{level()},
    s sep+=15pt,
  }
  [A
    [B
      [m]
      [C
        [n]
        [D, tikz={
          \draw [shift=(.parent anchor)] plot [smooth,tension=1] coordinates { (0,0) +(1.25,-.5) +(2.5,1) (t.child anchor)};
        }
          [o]
          [,phantom]
        ]
      ]
    ]
    [E
      [q]
      [F
        [r]
        [G
          [s]
          [t, name=t]
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

在 <code>森林</code> 树中绘制曲线

的手册forest很好,但有时有点紧张。第二部分可以找到简要介绍我的答案相关问题。这解释了如何使用括号表示法指定树,并介绍了该包的一些基本功能。

相关内容