20 怎样用 tikz“快速”画树

发布于 2024-12-09 00:05:58

我们大概是要用 tikz 绘制如下这样的树:
8160f731f26b85ef294266f41a7bec62.jpeg

  • 它由一些点构成和一些边构成,每个边连接两个点,所有边的长度一般是相等的,实际上我们并不关心它们的长度,这样仅仅是方便绘制
  • 一般情况没有圈(cycle)出现,但在这种情况下可以有,因为它并不影响绘制的方式
  • 每个边只能向上、下、左、右延伸,也就是说不能沿对角线延伸
  • 点和边的数量是有限的

以上的树自然可以用\node\draw命令完成,但我们希望能更加方便的绘制,确切地说是希望就像在纸上绘制的方式逐个点的画出。

以下是一些想法:

  1. 给出初始点的坐标,并绘制这个点
  2. 读取上一个点的坐标,记为(x1,y1), 然后通过某种方式输出下个点的坐标为 (x2,y2):=(x1+i,y1+j)然后绘制下个点,并且与上个点之间连接一条边,其中 i,j = 0,-1,1.但不能同时为 1或-1(否则就沿对角线延伸)。比如第二个点相较于第一个点是向右,那么 i = 1, j = 0.
  3. 之后的点同理递归地由前一个点给出

现在的问题是:如何读取前一个点的坐标?

在实际操作中,我们可以把向上、下、左、右的延伸封装成四个命令,需要什么就调用什么,但这些命令的参数是前一个点的坐标,也就是说如何获取这个参数?

希望有大佬给出解答或者思路,谢谢!

查看更多

关注者
1
被浏览
308
Sagittarius Rover
Sagittarius Rover 2024-12-09
我要成为TikZ糕手/(ㄒoㄒ)/~~

如果你不介意重复绘制的话,下面也许是可行的...

\documentclass[landscape]{article}
\usepackage[margin=1in,a3paper]{geometry}
\usepackage{tkz-graph}
\begin{document}
\ExplSyntaxOn
\cs_new_protected:Npn \draw_dot_diagram:n #1
{
    \pgfmathtruncatemacro{\NN}{0}
    \str_set:Nn \l_tmpa_str { #1 }
    \seq_clear:N \l_tmpa_seq
    \begin{tikzpicture}[
        line~join=round,line~cap=round,
        VertexStyle/.style = {
            shape=circle,draw,fill,
            minimum~size=5pt,
            inner~sep=0pt,
            outer~sep=0pt,
        }]
        \SetGraphUnit{2}
        \SetVertexNoLabel
        \Vertex{P\NN}
        \str_map_inline:Nn \l_tmpa_str
        {
            \pgfmathtruncatemacro{\tmp}{\NN+1}
            \str_case:nn { ##1 }
            {
                {U} {\NO(P\NN){P\tmp}}
                {D} {\SO(P\NN){P\tmp}}
                {L} {\WE(P\NN){P\tmp}}
                {R} {\EA(P\NN){P\tmp}}
            }
            \Edge(P\NN)(P\tmp)
            \pgfmathtruncatemacro{\NN}{\tmp}
        }
    \end{tikzpicture}
    \par \vspace*{3cm}
}
\draw_dot_diagram:n {RRUDRUDRR}

\draw_dot_diagram:n {RRRUDRUDRUDRR}

\draw_dot_diagram:n {RRRURUDLUUDLRDDDRRLDRURRUUDR}
\ExplSyntaxOff
\end{document}

其实重复绘制的问题应该是有优化空间的,但我下午还有课...

image.png

1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览