我正在尝试使用以下库在 TikZ 中创建 L 系统lindenmayersystems
:
我有这个代码:
\documentclass[border=1cm]{standalone}
\usepackage{tikz}
\usetikzlibrary{lindenmayersystems}
\pgfdeclarelindenmayersystem{A}{
\rule{A->F[+A][-A]}
}
\begin{document}
\begin{tikzpicture}[scale=10,rotate=90]
\draw
[blue,opacity=0.5,line width=0.5cm,line cap=round]
l-system [l-system={A,axiom=A
,order=4,angle=45,step=0.25cm}];
\end{tikzpicture}
\end{document}
此代码产生以下输出:
但如您所见,树的顶部树枝互相接触。我不希望这种情况发生。我希望线条的大小随着每一步而减小,就像下面的维基百科图片一样:
有没有办法在 TikZ 中做到这一点?
答案1
F
一种解决方案是以降低值的方式定义符号\pgflsystemstep
,即:
\pgfdeclarelindenmayersystem{A}{
\symbol{F}{\pgflsystemstep=0.6\pgflsystemstep\pgflsystemdrawforward}
\rule{A->F[+A][-A]}
}
这使:
上图完整代码:
\documentclass{article}
\usepackage{tikz}
\usepackage[active,tightpage]{preview}\PreviewEnvironment{tikzpicture}
\usetikzlibrary{lindenmayersystems}
\pgfdeclarelindenmayersystem{A}{
\symbol{F}{\pgflsystemstep=0.6\pgflsystemstep\pgflsystemdrawforward}
\rule{A->F[+A][-A]}
}
\begin{document}
\foreach \n in {1,...,8} {
\begin{tikzpicture}[scale=10,rotate=90]
\draw (-.1,-.2) rectangle (.4,0.2);
\draw
[blue,opacity=0.5,line width=0.1cm,line cap=round]
l-system [l-system={A,axiom=A
,order=\n,angle=45,step=0.25cm}];
\end{tikzpicture}
}
\end{document}
更新
更好的解决方案:定义一个新的符号(例如S
“比例”),用于更改比例,但不绘制任何内容。优点是它可以用于规则的任何部分。
使用这种方法,您的示例将是:
\pgfdeclarelindenmayersystem{A}{
\symbol{S}{\pgflsystemstep=0.6\pgflsystemstep}
\rule{A->SF[+A][-A]}
}
另一个示例显示了如何在规则的一部分中使用“缩放”,如下所示:
\pgfdeclarelindenmayersystem{A}{
\symbol{S}{\pgflsystemstep=0.5\pgflsystemstep}
\rule{A->F[+A][-A]SA}
}
使用方式如下:
\foreach \n in {1,...,6} {
\begin{tikzpicture}[scale=10,rotate=90]
\draw (-.03,-.17) rectangle (.35,0.17);
\draw
[blue,opacity=0.5,thin,line cap=round]
l-system [l-system={A,axiom=A
,order=\n,angle=15,step=0.05cm}];
\end{tikzpicture}
}
生产