如何在连接子节点的边之间画弧?

如何在连接子节点的边之间画弧?

我有以下代码来生成几棵树。如何在边之间绘制弧线(图中用红色标记)?

\usetikzlibrary{intersections}
\begin{tikzpicture}

\node {Goto(P$_A$)} [grow'=up]
child {node { Say(A,P$_A$)}}
child {node {IsTrue(A)}
};
\begin{scope}[xshift=4.5cm]
\node {Goto(P$_B$)} [grow'=up]
child { node [left=0cm]{ Goto(P$_B$)}
    child {node (sayb) { Say(B,P$_B$)}}
    child {node (istrueb) {IsTrue(B)}}
}
child {node [right=0cm]{ Goto(P$_B$)}
    child {node { Say(C,P$_B$)}}
    child {node {IsTrue(C)}}
};
\end{scope}
\end{tikzpicture}

在此处输入图片描述

答案1

可能有更简单的解决方案,但下一个可行。它绘制一个以父锚点为中心的圆,该圆被夹在一个三角形内,该三角形的顶点位于父锚点,子锚点的中心位于三角形内。

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{intersections}

\newcommand\myarc[4]{\begin{scope}[very thick,red]
    \clip (#1)--(#2)--(#3)--cycle;
    \draw (#1) circle (#4);\end{scope}}

\begin{document}
\begin{tikzpicture}

\node (rootA) {Goto(P$_A$)} [grow'=up,parent anchor=north]
child {node { Say(A,P$_A$)}}
child {node {IsTrue(A)}
};

\begin{scope}[xshift=4.5cm]
\node (rootB) {Goto(P$_B$)} [grow'=up, parent anchor=north]
child { node [left=0cm]{ Goto(P$_B$)}
    child {node (sayb) { Say(B,P$_B$)}}
    child {node (istrueb) {IsTrue(B)}}
}
child {node [right=0cm]{ Goto(P$_B$)}
    child {node { Say(C,P$_B$)}}
    child {node {IsTrue(C)}}
};

\end{scope}

\myarc{rootA.north}{rootA-1.center}{rootA-2.center}{5mm}
\myarc{rootB.north}{rootB-1.center}{rootB-2.center}{6mm}
\myarc{rootB-1.north}{sayb.center}{istrueb.center}{5mm}
\myarc{rootB-2.north}{rootB-2-1.center}{rootB-2-2.center}{5mm}

\end{tikzpicture}
\end{document}

在此处输入图片描述

更新

如果你使用TikZ 3.0你可以使用angles定义一个库pic angle

图片类型 angle=<A>--<B>--<C>

此图为当前路径添加了一个角度图。此“角度图”由一个“扇形”或“楔形”或“切片”组成,其尖端位于 点,其直边位于 和 到 的线上。[...] 三个点<A><B><C>必须是节点或坐标的名称;您不能在此处使用直接坐标,例如“(1,1)”。

最后一句有点问题,因为不能用作rootA.north三点之一,必须将其转换为coordinate。它接受,rootA这意味着rootA.center

代码angles为:

\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{angles}

\begin{document}
\begin{tikzpicture}

\node (rootA) {Goto(P$_A$)} [grow'=up]
child {node { Say(A,P$_A$)}}
child {node {IsTrue(A)}
};

\draw pic[draw, red, thick, angle radius=8mm] {angle=rootA-2--rootA--rootA-1};

\begin{scope}[xshift=4.5cm]
\node (rootB) {Goto(P$_B$)} [grow'=up, parent anchor=north]
child { node [left=0cm]{ Goto(P$_B$)}
    child {node (sayb) { Say(B,P$_B$)}}
    child {node (istrueb) {IsTrue(B)}}
}
child {node [right=0cm]{ Goto(P$_B$)}
    child {node { Say(C,P$_B$)}}
    child {node {IsTrue(C)}}
};

\end{scope}

\draw (rootB.north) coordinate (A) 
      pic[draw, red, thick, angle radius=3mm] 
      {angle=rootB-2--A--rootB-1};

\draw (rootB-1.north) coordinate (A) 
      pic[draw, red, thick, angle radius=3mm] 
      {angle=istrueb--A--sayb};

\draw (rootB-2.north) coordinate (A) 
      pic[draw, blue, very thick, angle radius=3mm] 
      {angle=rootB-2-2--A--rootB-2-1};

\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

这是一个可能的解决方案。由于没有兄弟距离信息,该解决方案假设有自己的信息。基本上,每个节点都有内部名称,并calc通过 ($(name1)!0.5!(name2)$) 确定起点和终点,然后通过以下方式绘制圆弧:

\draw ($(o)!0.5!(A)$) to[bend left=30]  ($(o)!0.5!(B)$);

在此处输入图片描述

代码

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{trees,calc}
\usetikzlibrary{intersections}
\begin{document}


\begin{tikzpicture}[level distance=2cm, 
                    level 1/.style={sibling distance=3cm},
                    level 2/.style={sibling distance=2cm},
]
\node (o) {Goto(P$_A$)} [grow'=up]
child {node (A) {Say(A,P$_A$)}}
child {node (B){IsTrue(A)}
};
\draw[red,very thick] ($(o)!0.5!(A)$) to[bend left=30]  ($(o)!0.5!(B)$);

\begin{scope}[xshift=6.5cm]
\node {Goto(P$_B$)} [grow'=up]
child { node (B) [left=0cm]{ Goto(P$_B$)}
    child {node (sayb) { Say(B,P$_B$)}}
    child {node (istrueb) {IsTrue(B)}}
}
child {node (C)[right=0cm]{ Goto(P$_B$)}
    child {node (sayc)  {Say(C,P$_B$)}}
    child {node (istruec){IsTrue(C)}}
};
\draw[red,very thick] ($(B)!0.5!(sayb)$) to[bend left=30]  ($(B)!0.5!(istrueb)$);
\draw[red,very thick] ($(C)!0.5!(sayc)$) to[bend left=30]  ($(C)!0.5!(istruec)$);
\end{scope}
\end{tikzpicture}


\end{document}

相关内容