更新

更新

我正在嘗試使用該lindenmayersystems庫在 TikZ 中創建一個 L 系統:

我有這個代碼:

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

此程式碼產生以下輸出:

但正如您所看到的,樹的頂部樹枝相互接觸。我不希望這種情況發生。我希望每一步都應減少線條的大小,如以下維基百科圖像所示:

TikZ 有什麼辦法可以做到這一點嗎?

答案1

F一種解決方案是以減少 值的方式定義符號\pgflsystemstep,即:

\pgfdeclarelindenmayersystem{A}{
  \symbol{F}{\pgflsystemstep=0.6\pgflsystemstep\pgflsystemdrawforward}
  \rule{A->F[+A][-A]}
}

這使:

結果

上圖完整程式碼:

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

更新

更好的解決方案:定義一個新符號(例如,S“比例”),它會更改比例,但不繪製任何內容。優點是它可以用在規則的任何部分。

使用這種方法,您的範例將是:

\pgfdeclarelindenmayersystem{A}{
  \symbol{S}{\pgflsystemstep=0.6\pgflsystemstep}
  \rule{A->SF[+A][-A]}
}

另一個範例顯示如何在規則的一部分中使用“縮放”,可以是:

\pgfdeclarelindenmayersystem{A}{
  \symbol{S}{\pgflsystemstep=0.5\pgflsystemstep}
  \rule{A->F[+A][-A]SA}
}

其中,使用這種方式:

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

產生

第二個例子

相關內容