
Estoy intentando crear un sistema L en TikZ usando la lindenmayersystems
biblioteca:
Tengo 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 produce este resultado:
Pero como puedes ver, las ramas superiores del árbol se tocan entre sí. No quiero que esto suceda. Quiero que el tamaño de la línea se reduzca con cada paso, como en la siguiente imagen de Wikipedia:
¿Hay alguna forma de hacer esto en TikZ?
Respuesta1
Una solución es definir el símbolo F
de una manera que reduzca el valor de \pgflsystemstep
, es decir:
\pgfdeclarelindenmayersystem{A}{
\symbol{F}{\pgflsystemstep=0.6\pgflsystemstep\pgflsystemdrawforward}
\rule{A->F[+A][-A]}
}
Lo que da:
Código completo para la figura anterior:
\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}
Actualizar
Una mejor solución: definir un nuevo símbolo (por ejemplo, S
para "escala") que cambie la escala, pero no dibuje nada. La ventaja es que se puede utilizar en cualquier parte de la regla.
Usando este enfoque, su ejemplo sería:
\pgfdeclarelindenmayersystem{A}{
\symbol{S}{\pgflsystemstep=0.6\pgflsystemstep}
\rule{A->SF[+A][-A]}
}
Otro ejemplo, que muestra cómo se puede utilizar la "escala" en una parte de una regla, podría ser:
\pgfdeclarelindenmayersystem{A}{
\symbol{S}{\pgflsystemstep=0.5\pgflsystemstep}
\rule{A->F[+A][-A]SA}
}
que, usado de esta manera:
\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}
}
produce