
Estou tentando fazer um sistema L no TikZ usando a lindenmayersystems
biblioteca:
Eu tenho este código:
\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}
Este código está produzindo esta saída:
Mas como você pode ver, os galhos superiores da árvore estão se tocando. Eu não quero que isso aconteça. Quero que o tamanho da linha seja reduzido a cada passo, como na imagem a seguir da Wikipedia:
Existe alguma maneira de fazer isso no TikZ?
Responder1
Uma solução é definir o símbolo F
de uma forma que reduza o valor de \pgflsystemstep
, ou seja:
\pgfdeclarelindenmayersystem{A}{
\symbol{F}{\pgflsystemstep=0.6\pgflsystemstep\pgflsystemdrawforward}
\rule{A->F[+A][-A]}
}
Que dá:
Código completo para a figura acima:
\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}
Atualizar
Uma solução melhor: Defina um novo símbolo (por exemplo, S
para "escala") que altere a escala, mas não desenhe nada. A vantagem é que pode ser utilizado em qualquer parte da regra.
Usando esta abordagem, seu exemplo seria:
\pgfdeclarelindenmayersystem{A}{
\symbol{S}{\pgflsystemstep=0.6\pgflsystemstep}
\rule{A->SF[+A][-A]}
}
Outro exemplo, que mostra como a “escala” pode ser utilizada em uma parte de uma regra, poderia ser:
\pgfdeclarelindenmayersystem{A}{
\symbol{S}{\pgflsystemstep=0.5\pgflsystemstep}
\rule{A->F[+A][-A]SA}
}
que, usado desta forma:
\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}
}
produz