TikZ 中的 Lindenmayer 系统

TikZ 中的 Lindenmayer 系统

晚上好,

我试图了解 TikZ 库 lindenmayersystems 的工作原理,更准确地说,我对以下代码有一些问题,我试图尽可能清楚地说明:

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{lindenmayersystems}

\begin{document}

\begin{tikzpicture}
  % I just store the initial length
  \newlength\initialstep
  \setlength\initialstep\pgflsystemstep

  % Computation of an angle
  \pgfmathparse{180-180/5} % will be less trivial at the end
  \pgfmathsetmacro\angle\pgfmathresult

  % Computation of a ratio
  \pgfmathparse{2*0.5/(1-0.5)} % this seems trivial but this is just a particular case
  \pgfmathsetmacro\scaling\pgfmathresult

  \pgfdeclarelindenmayersystem{KochC}{
    % d does a turn around
    \symbol{d}{
    \pgflsystemleftangle=180
    \pgflsystemturnleft
    \pgflsystemleftangle=\angle
    }

    % move on a certain portion
    \symbol{c}{
    \pgflsystemstep=\scaling*\initialstep
    \pgflsystemdrawforward
    \pgflsystemstep=\initialstep
    }

    % new measures
    \symbol{n}{
    \pgflsystemstep=\scaling*\initialstep
    }

    \rule{A->A[cA]nd-A-A-A-A}
  }
  \draw[blue,line cap=round] [lindenmayer system={KochC,axiom=A,order=1}] lindenmayer system;
\end{tikzpicture}

\end{document}

我犯的错误是! Illegal unit of measure (pt inserted).,这似乎不太相关,除非我完全弄错了。

此代码的目的是绘制一条线段,并将其中心部分用 n-gone 替换,这里 n 是 5。我遇到的另一个问题是让这个 n 成为任何自然数,但似乎找不到方法,但这是另一个问题。

我将非常感激您的帮助。

谢谢你,

皮埃尔

PS:我之所以将 pgflsystemstep 存储在开头,是因为这段代码实际上会在某些有意义的情况下使用。我保留了这一行,以防万一它有问题。

答案1

欢迎使用 TeX-SE!错误来自您之前使用的星号\initialstep。您\initalstep通过说来定义长度\newlength\initialstep,因此您不想使用*s。下面我\pgmathsetmacro稍微缩短了内容,但仍然有效。我正在使用你的代码来自下面的评论(略作修改)因为结果看起来很棒。

\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{lindenmayersystems}

\begin{document}

%\newcommand{kochC}[1]
%{

  \begin{tikzpicture}
    % je stocke pfgsystemstep dans une nouvelle variable initialstep : c'est la longueur du premier segment
    \newlength\initialstep

    % je calcule l'angle dont il faut tourner pour faire un polygône réglier à n côtés
    \pgfmathsetmacro\angle{360/5} % changer 5 en le nombre de côtés qu'on veut

    % je calcule le facteur de scaling
    \pgfmathsetmacro\scaling{2*0.33/(1-0.33)} %\pgfmathparse{2*#1/(1-#1)}

    \pgfdeclarelindenmayersystem{KochC}{
      % s initialise les données
      \symbol{s}{
       \def\pgflsystemleftangle{-\angle}
       \def\pgflsystemrightangle{180-\angle}
       \setlength\initialstep\pgflsystemstep
     }

      % avancer sur une portion de longueur c sans tracer
      \symbol{c}{
       \pgflsystemstep=\scaling\initialstep
       \pgflsystemmoveforward
       \pgflsystemstep=\initialstep
     }

      % nouvelles mesures
      \symbol{n}{
       \pgflsystemstep=\scaling\pgflsystemstep
     }

     \rule{F->sF[cF]n-F+F+F+F}
   }
   \draw[blue,line cap=round] [lindenmayer system={KochC,axiom=F,order=1}] lindenmayer system;
 \end{tikzpicture}
%}

%\kochC[0.5]

\end{document}

在此处输入图片描述

笔记:

  • 如果要处理长度,则不能使用*(除非使用类似的\pgfmathsetlengthmacro但这里没有必要),并且不能使用来设置长度\def,而只能使用\setlength或仅设置<new length>=<factor><other length>,其中<factor>是一个数字。(请注意,=有时更安全,因为我相信要记住一些包会重新定义,\setlength但这在这里并不重要。)
  • 如果您重新定义宏,则可以\renewcommand在此处使用或\pgfmathsetmacro\def。但是,如果宏之前不存在,后两者不会发出警告。

相关内容