有人能帮我在 tikz 上重新创建这张图片吗?我真的不知道从哪里开始
答案1
请注意,我认为我不应该回答“为我做”的问题,但有时我会做我认为不应该做的事情。
我会使用 Forest。其他人会使用其他东西。MetaPost、普通的 TikZtikz-trees
等。事实上,树非常简单。唯一稍微不标准的地方是三角根。这里的技巧是使用shape border rotate
形状旋转但文本不旋转。
\documentclass[border=12pt]{standalone}
% ateb: https://tex.stackexchange.com/a/714445/
\usepackage[edges]{forest}
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{forest}
forked edges,
for descendants={circle,},
for tree={draw,font=\sffamily,thick,edge+=thick,},
regular polygon sides=3,
regular polygon,
shape border rotate=180,
inner sep=0pt,
% for children={fork sep'=0pt,},% uncomment to remove line between root and edge
[10 [5] [3 [1][1]]]
\end{forest}
\end{document}
[由于 Okular 错误,我目前无法制作任何有价值的图像,所以我甚至不会尝试。]
答案2
单独带有 tikz 的版本。
更新:去除根部下方小垂直线的技巧
为此,我构建了节点而不追踪边缘。然后我手动构建它们。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,shapes.geometric}
\begin{document}
\begin{tikzpicture}[
every child node/.style={circle,draw},
edge from parent path={}
]
\node[regular polygon, regular polygon sides=3,draw,shape border rotate=60,inner sep=0pt]
(root) {10}[sibling distance=20mm]
child {node {5}}
child {node {3}[sibling distance=10mm]
child {node {1}}
child {node {1}}
};
\coordinate (aux) at ($(root-2-1)!.5!(root-2-2)!.5!(root-2)$);
\draw(root-2-1)|-(aux)--(root-2);
\draw(root-2-2)|-(aux)--(root-2);
\draw(root-1)|-(root.south);
\draw(root-2)|-(root.south);
\end{tikzpicture}
\end{document}
第一个答案:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,shapes.geometric}
\begin{document}
\begin{tikzpicture}[every child node/.style={circle,draw},
edge from parent path=
{(\tikzparentnode.south) |-($(\tikzparentnode.south)!.5!(\tikzchildnode.north)$)-| (\tikzchildnode.north)}
]
\node[regular polygon, regular polygon sides=3,draw,shape border rotate=60,inner sep=0pt]
(root) {10}[level distance =15mm,sibling distance=20mm]
child {node {5}}
child {node {3}[level distance=12mm,sibling distance=10mm]
child {node {1}}
child {node {1}}
};
\end{tikzpicture}
\end{document}
答案3
以下是 中以基本步骤实现此目标的方法Tikz
,对初学者来说可能更容易。让我们从小步骤开始:从简单开始,然后逐步完善。
我建议:
- 查看教程手册并并行查找所有这些命令。(做起来比书面上看起来要容易得多。)
- 为了简化我在逐步过程中展示的一些行,以便更好地理解在代码的原始或不成熟状态下结果会是什么样子。
1. 放置节点
首先开始放置节点,使用虚拟文本或真实内容,这无关紧要。确保它们最终的分布或多或少符合您的要求。
有很多方法可以做到这一点。这里我使用绝对坐标,还有更多方法。所以从某事开始。例如:
...
\node (T) at ( 0,-1) {10};
\node (A1) at (-2,-2) {5};
...
这会
- 放置节点
- 在指定位置(以厘米为单位)
{..}
在es里面有一些文本- 给他们命名(T),(A1)......这将使以后很容易引用他们的位置(见下文)
2. 连接节点
首先,直接连接节点,如下所示:
\draw (T) -- (A1);
...
\draw (A2) -- (B1);
...
接下来,稍微修改一下线条,通过替换 s 来使用右下分支的中间点--
:
% \draw (A2) -- (B1);
\draw (A2) |- +(0,-1) -| (B1);
\draw (A2) |- +(0,-1) -| (B2);
这会:
- 从节点 (A2) 开始
- 向下移动,然后水平移动
- 到相对坐标中的某个点 (+x=0, +y=-1)
- 从那里水平移动而不是垂直移动
- 直到遇到节点(B1)
因为你想让三角形直接与线相交,所以你可以做得稍微不同一些,如下所示:
\draw (T.south) -| (A1);
- 从节点(T)的南侧开始,即中下部
- 水平移动,然后垂直移动
- 直到遇到节点 (A1)
3. 格式化节点
现在让我们做一些微调:
...
\begin{tikzpicture}[ % self defined styles
crc/.style={draw,circle,minimum width=6mm},
tri/.style={draw, minimum width=6mm,inner sep=0mm,
regular polygon,regular polygon sides=3,
shape border rotate=180},
]
% ~~~ placing the nodes ~~~~~~~~
\node[tri] (T) at ( 0,-1) {10};
\node[crc] (A1) at (-2,-2) {5};
...
节点具有周围形状,默认情况下为矩形且不可见。它会根据其内容自动调整其形状尺寸。
为了使形状可见并修改许多内容,您可以向节点添加选项列表,如下所示:
\node[draw, option=xy, option=qr, ...] at (10,20) {some text};
这很笨拙,很多时候你想多次使用一个样式。因此,你将定义移到开头,如图所示。
样式:crc
crc/.style={draw,circle,minimum width=6mm},
- 绘制(即以默认颜色(黑色)绘制形状)
- 改变形状为圆形
- 通过指定节点的宽度至少应为多少来间接调整其直径
要得到一个三角形,你还需要在其顶部绘制一个直径不太大的三边多边形:
\usetikzlibrary{shapes.geometric}
...
tri/.style={draw, minimum width=6mm,inner sep=0mm,
regular polygon,regular polygon sides=3,
shape border rotate=180},
代码
\documentclass[10pt,border=3mm,tikz]{standalone}
\usetikzlibrary{shapes.geometric}
\begin{document}
\begin{tikzpicture}[ % self defined styles
crc/.style={draw,circle,minimum width=6mm},
tri/.style={draw, minimum width=6mm,inner sep=0mm,
regular polygon,regular polygon sides=3,
shape border rotate=180},
]
% ~~~ placing the nodes ~~~~~~~~
\node[tri] (T) at ( 0,-1) {10};
\node[crc] (A1) at (-2,-2) {5};
\node[crc] (A2) at ( 2,-2) {3};
\node[crc] (B1) at ( 1,-4) {1};
\node[crc] (B2) at ( 3,-4) {1};
% ~~~ connections ~~~~~~~
\draw (T.south) -| (A1);
\draw (T.south) -| (A2);
% \draw (A2) -- (B1);
\draw (A2) |- +(0,-1) -| (B1);
\draw (A2) |- +(0,-1) -| (B2);
\end{tikzpicture}
\end{document}