我们大概是要用 tikz 绘制如下这样的树:
以上的树自然可以用\node
和\draw
命令完成,但我们希望能更加方便的绘制,确切地说是希望就像在纸上绘制的方式逐个点的画出。
以下是一些想法:
(x1,y1)
, 然后通过某种方式输出下个点的坐标为 (x2,y2):=(x1+i,y1+j)
然后绘制下个点,并且与上个点之间连接一条边,其中 i,j = 0,-1,1
.但不能同时为 1或-1(否则就沿对角线延伸)。比如第二个点相较于第一个点是向右,那么 i = 1, j = 0
.现在的问题是:如何读取前一个点的坐标?
在实际操作中,我们可以把向上、下、左、右的延伸封装成四个命令,需要什么就调用什么,但这些命令的参数是前一个点的坐标,也就是说如何获取这个参数?
希望有大佬给出解答或者思路,谢谢!
如果你不介意重复绘制的话,下面也许是可行的...
\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}
其实重复绘制的问题应该是有优化空间的,但我下午还有课...
感谢 S 老师的高明解答,但可惜我对 l3 几乎一无所知,所以看不懂代码,只能先照搬使用。
@u26254 由于 S 老师后续可能对答案优化,所以我先不采纳,等优化完成后采纳。
@u26254 不优化了,学业繁忙啊(bushi)留给有缘人吧~
@u70550 谢谢大佬