
Ich versuche, mithilfe der lindenmayersystems
Bibliothek ein L-System in TikZ zu erstellen:
Ich habe diesen Code:
\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}
Dieser Code erzeugt diese Ausgabe:
Aber wie man sehen kann, berühren sich die oberen Äste des Baumes. Das möchte ich nicht. Ich möchte, dass die Größe der Linie mit jedem Schritt reduziert wird, wie im folgenden Wikipedia-Bild:
Gibt es eine Möglichkeit, dies in TikZ zu tun?
Antwort1
F
Eine Lösung besteht darin, das Symbol so zu definieren , dass der Wert von reduziert wird \pgflsystemstep
, also:
\pgfdeclarelindenmayersystem{A}{
\symbol{F}{\pgflsystemstep=0.6\pgflsystemstep\pgflsystemdrawforward}
\rule{A->F[+A][-A]}
}
Das ergibt:
Vollständiger Code für die obige Abbildung:
\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}
Aktualisieren
Eine bessere Lösung: Definieren Sie ein neues Symbol (z. B. S
für „Maßstab“), das den Maßstab ändert, aber nichts zeichnet. Der Vorteil ist, dass es in jedem Teil der Regel verwendet werden kann.
Mit diesem Ansatz würde Ihr Beispiel wie folgt aussehen:
\pgfdeclarelindenmayersystem{A}{
\symbol{S}{\pgflsystemstep=0.6\pgflsystemstep}
\rule{A->SF[+A][-A]}
}
Ein weiteres Beispiel, das zeigt, wie die „Skalierung“ in einem Teil einer Regel verwendet werden kann, könnte sein:
\pgfdeclarelindenmayersystem{A}{
\symbol{S}{\pgflsystemstep=0.5\pgflsystemstep}
\rule{A->F[+A][-A]SA}
}
was, folgendermaßen verwendet:
\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}
}
produziert