アップデート

アップデート

私はライブラリを使用して TikZ で L システムを作成しようとしていますlindenmayersystems:

次のようなコードがあります:

\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

F1 つの解決策は、の値を減らす方法でシンボルを定義することです\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}
}

生産する

2番目の例

関連情報