我有以下代码来生成几棵树。如何在边之间绘制弧线(图中用红色标记)?
\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}