标记精确定位的“树”节点

标记精确定位的“树”节点

我正在和 Ti 合作Z 并且基本上正在绘制一棵树,但我的需求要求节点在坐标空间中的位置精确且大小精确。为此,我发现使用命令\draw可以让我进行最精细的控制。但是,我希望每个节点都沿着源自其父节点的边缘进行标记(或者,对于根节点,只是右侧的一个标签)。

从这里的一些其他有用的答案中,我得到了以下 MWE,它非常接近我想要的:

\documentclass[letterpaper]{article}
\usepackage[utf8]{inputenc}

\usepackage{tikz}
    \usetikzlibrary{decorations.markings}

\begin{document}

\begin{tikzpicture}[x=10mm,y=10mm,
    name/.style={%
    postaction={ decorate,transform shape,
    decoration={ markings, mark=at position 1.0 with \node #1;}}}]

% Set styles for tree nodes
\tikzstyle{gen0} = [circle, minimum width=16pt, fill, inner sep=0pt]
\tikzstyle{gen1} = [circle, minimum width=12pt, fill, inner sep=0pt]

% ==============================

\draw[black!50] (0,0) grid (8,8);

\draw[name={[right]{nodeA}}]        (3,8)           node[gen0]{};

\draw[name={[above left]{nodeB}}]   (3,8) -- (0,4)  node[gen1]{};
\draw[name={[above left]{nodeC}}]   (3,8) -- (7,2)  node[gen1]{};

% ==============================

\end{tikzpicture}

\end{document}

实际输出如下所示:

编译的 MWE

我的目标是得到类似我在 Photoshop 中制作的模型:

期望输出模型

具体来说,我希望标签与边缘每个节点的,而不是来自中心,这样它们就不会被遮盖住。我还想能够选择标签出现在路径的哪一侧,这样它们就不会颠倒过来。

此外,如果有更好的方法可以更普遍地使用\node\path命令而不是单个\draw命令来实现这种精确定位的树结构,那将非常有帮助。我的实际用例将有几十个节点,它们分布在几代中,绝对坐标精确到小数点后几位,所以我宁愿不必不断重新列出父节点的坐标来绘制每条边。

答案1

我建议你将圆节点的放置与线条和标签分开。这样做的好处是,TikZ 知道线条从节点的边缘开始,这使得标签放置变得更容易:

\documentclass[letterpaper]{article}
\usepackage[utf8]{inputenc}

\usepackage{tikz}
    \usetikzlibrary{decorations.markings}

\begin{document}

\begin{tikzpicture}[x=10mm,y=10mm]

% Set styles for tree nodes
\tikzstyle{gen0} = [circle, minimum width=16pt, fill, inner sep=0pt]
\tikzstyle{gen1} = [circle, minimum width=12pt, fill, inner sep=0pt]

% ==============================

\draw[black!50] (0,0) grid (8,8);

\node [gen0, label=right:nodeA] (A) at (3,8) {};
\node [gen1] (B) at (0,4) {};
\node [gen1] (C) at (7,2) {};

\draw (B) -- (A) node [pos=0, sloped, anchor=south west, inner sep=1pt] {nodeB};
\draw (A) -- (C) node [pos=1, sloped, anchor=south east, inner sep=1pt] {nodeC};

% ==============================

\end{tikzpicture}

\end{document}

相关内容