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 treea R, a M, a L부분으로 나누었습니다. 각 부분은 세 개의 "부분" 중 하나만 그리고 다른 두 부분 \pgflsystemmoveforward대신에 사용합니다. 그런 다음 3가지 색상으로 \pgflsystemdrawforward3가지 명령을 사용할 수 있습니다 . \draw:)여기에 이미지 설명을 입력하세요

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

관련 정보