Как рисовать разные линии разными цветами с помощью tikz l-systems

Как рисовать разные линии разными цветами с помощью tikz l-systems

Я пытаюсь создать изображение бесконечного корневого троичного дерева, следующий код отлично справится с этой задачей.

\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}

Однако я хотел бы, чтобы края, соответствующие каждой букве, были окрашены в разные цвета, например, L — в красный, M — в зеленый, а G — в синий. Я пробовал

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

но, похоже, ничего не происходит. Есть предложения?

решение1

После некоторых размышлений я пришел к выводу, что проще всего рисовать части R,M,L по отдельности разными цветами. Поэтому я разделил их 3-ary rooted treeна части a R, a Mи a L, каждая из которых рисует только одну из трех "частей" и использует \pgflsystemmoveforwardвместо \pgflsystemdrawforwardна двух других. Затем вы можете использовать 3 разные \drawкоманды с 3 разными цветами :). введите описание изображения здесь

\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}

Редактировать: Я нашел трюк (баг? фича?), чтобы объявить дерево только один раз: вывод точно такой же, как и выше. Хитрость в том, что вы можете использовать команду, \symbolчтобы просто двигаться в трех направлениях без рисования, и сказать ей рисовать в одном из трех, и она переопределит предыдущую команду "просто двигаться" для этого направления. Дайте ей параметр, и она динамически нарисует нужную вам ветвь!

\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}

Связанный контент