So zeichnen Sie mit Tikz L-Systemen unterschiedliche Linien mit unterschiedlichen Farben

So zeichnen Sie mit Tikz L-Systemen unterschiedliche Linien mit unterschiedlichen Farben

Ich versuche, ein Bild von einem ternären Baum mit unendlichen Wurzeln zu erstellen. Mit dem folgenden Code funktioniert das ganz gut.

\documentclass[12pt]{article}

\usepackage{tikz}
\usetikzlibrary{lindenmayersystems}
\begin{document}

\begin{figure}
    \begin{tikzpicture}
        \pgfdeclarelindenmayersystem{3-ary rooted tree}{
            \rule{L -> L [s+ [-L] [M] [+R]]}
            \rule{M -> M [s  [-L] [M] [+R]]}
            \rule{R -> R [s- [-L] [M] [+R]]}

            \symbol{L}{\pgflsystemdrawforward}
            \symbol{M}{\pgflsystemdrawforward}
            \symbol{R}{\pgflsystemdrawforward}
            \symbol{s}{\pgflsystemstep =0.4 \pgflsystemstep}
        }
        \draw[rotate = -90] l-system [l-system={3-ary rooted tree,axiom = [-L] [M] [+R], angle=45, step=6cm, order=5}];
    \end{tikzpicture}
\end{figure}
\end{document}

Ich möchte jedoch, dass die Kanten der einzelnen Buchstaben in unterschiedlichen Farben eingefärbt werden, beispielsweise L rot, M grün und G blau. Ich habe versucht

  \symbol{L}{\pgflsystemdrawforward}[red]
  \symbol{M}{\pgflsystemdrawforward}[green]
  \symbol{R}{\pgflsystemdrawforward}[blue]

aber es scheint nichts zu bewirken. Irgendwelche Vorschläge?

Antwort1

nach einigem Nachdenken denke ich, dass es am einfachsten ist, die Teile R, M und L separat in unterschiedlichen Farben zu zeichnen. Also habe ich 3-ary rooted treein a R, a Mund a aufgeteilt L, wobei jeder nur einen der drei „Teile“ zeichnet und \pgflsystemmoveforwardanstelle von \pgflsystemdrawforwardauf den anderen beiden verwendet. Dann können Sie 3 verschiedene \drawBefehle mit 3 verschiedenen Farben verwenden :). Bildbeschreibung hier eingeben

\documentclass[12pt]{article}

\usepackage{tikz}
\usetikzlibrary{lindenmayersystems}
\begin{document}

    \begin{figure}
        \begin{tikzpicture}
        \pgfdeclarelindenmayersystem{3-ary rooted tree-L}{  %define the left branch
            \rule{L -> L [s+ [-L] [M] [+R]]}
            \rule{M -> M [s  [-L] [M] [+R]]}
            \rule{R -> R [s- [-L] [M] [+R]]}

            \symbol{L}{\pgflsystemdrawforward}  % draw the L branch
            \symbol{M}{\pgflsystemmoveforward}  % only move
            \symbol{R}{\pgflsystemmoveforward}  % only move
            \symbol{s}{\pgflsystemstep =0.4 \pgflsystemstep}
        }
        \pgfdeclarelindenmayersystem{3-ary rooted tree-M}{ % define the middle branch
            \rule{L -> L [s+ [-L] [M] [+R]]}
            \rule{M -> M [s  [-L] [M] [+R]]}
            \rule{R -> R [s- [-L] [M] [+R]]}

            \symbol{L}{\pgflsystemmoveforward}  % only move
            \symbol{M}{\pgflsystemdrawforward}  % draw the M branch
            \symbol{R}{\pgflsystemmoveforward}  % only move
            \symbol{s}{\pgflsystemstep =0.4 \pgflsystemstep}
        }
        \pgfdeclarelindenmayersystem{3-ary rooted tree-R}{ % define the right branch
            \rule{L -> L [s+ [-L] [M] [+R]]}
            \rule{M -> M [s  [-L] [M] [+R]]}
            \rule{R -> R [s- [-L] [M] [+R]]}

            \symbol{L}{\pgflsystemmoveforward}  % only move
            \symbol{M}{\pgflsystemmoveforward}  % only move
            \symbol{R}{\pgflsystemdrawforward}  % draw the R branch
            \symbol{s}{\pgflsystemstep =0.4 \pgflsystemstep}
        }
        \draw[rotate = -90,color=blue] l-system [l-system={3-ary rooted tree-L,axiom = [-L] [M] [+R], angle=45, step=6cm, order=5}];
        \draw[rotate = -90,color=red] l-system [l-system={3-ary rooted tree-M,axiom = [-L] [M] [+R], angle=45, step=6cm, order=5}];
        \draw[rotate = -90,color=green] l-system [l-system={3-ary rooted tree-R,axiom = [-L] [M] [+R], angle=45, step=6cm, order=5}];

        \end{tikzpicture}
    \end{figure}
\end{document}

Bearbeiten: Ich habe einen Trick (Bug? Feature?) gefunden, um den Baum nur einmal zu deklarieren: Die Ausgabe ist genau dieselbe wie oben. Der Trick besteht darin, dass Sie den \symbolBefehl verwenden können, um sich einfach in die 3 Richtungen zu bewegen, ohne zu zeichnen, und ihm sagen können, dass er in eine der drei Richtungen zeichnen soll. Dadurch wird der vorherige Befehl „einfach bewegen“ für diese Richtung überschrieben. Geben Sie ihm einen Parameter und Sie lassen ihn den gewünschten Zweig dynamisch zeichnen!

\documentclass[12pt]{article}

\usepackage{tikz}
\usetikzlibrary{lindenmayersystems}
\newcommand{\defbranch}[1]{
    \pgfdeclarelindenmayersystem{3-ary rooted tree#1}{  % dynamic definition of the branches
        \rule{L -> L [s+ [-L] [M] [+R]]}
        \rule{M -> M [s  [-L] [M] [+R]]}
        \rule{R -> R [s- [-L] [M] [+R]]}

        \symbol{L}{\pgflsystemmoveforward} % only move
        \symbol{M}{\pgflsystemmoveforward} % only move
        \symbol{R}{\pgflsystemmoveforward} % only move
        \symbol{#1}{\pgflsystemdrawforward}  % draw the branch (overrides previous command)
        \symbol{s}{\pgflsystemstep =0.4 \pgflsystemstep}
    }
}
\defbranch{L} % define the branches (needed only once per documents)
\defbranch{M}
\defbranch{R}

\newcommand{\branch}[2]{  %define command to draw branches.
    %You can add more parameters for step, angle, order,... if needed
    \draw[rotate = -90,color=#2] l-system [l-system={3-ary rooted tree#1,axiom = [-L] [M] [+R], angle=45, step=6cm, order=5}];
}

\begin{document}
\begin{figure}
    \begin{tikzpicture}
        \branch{L}{blue}
        \branch{M}{red}
        \branch{R}{green}
    \end{tikzpicture}
\end{figure}
\end{document}

verwandte Informationen