晚上好,
我试图了解 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
。但是,如果宏之前不存在,后两者不会发出警告。