Algorithm L系统节点重写示例

Algorithm L系统节点重写示例,algorithm,fractals,procedural-programming,procedural-generation,l-systems,Algorithm,Fractals,Procedural Programming,Procedural Generation,L Systems,这是我在StackoverFlow的第一篇文章。 最近我开始读一本名为《植物的算法之美》的书,在第一章中,他解释了L系统。(你可以读这一章) 据我所知,L系统有两种类型。边重写和节点重写 边缘重写相对来说非常简单。有一个初始起始多边形和一个生成器。初始多边形的每条边(边)将替换为生成器 但是这个节点重写非常混乱。从我收集的信息来看,有两个或更多的规则,每次迭代都会用它们的常量替换规则中的变量 对于海龟的解释,这些是标准规则 F : Move turtle forward in current d

这是我在StackoverFlow的第一篇文章。 最近我开始读一本名为《植物的算法之美》的书,在第一章中,他解释了L系统。(你可以读这一章)

据我所知,L系统有两种类型。边重写和节点重写

边缘重写相对来说非常简单。有一个初始起始多边形和一个生成器。初始多边形的每条边(边)将替换为生成器

但是这个节点重写非常混乱。从我收集的信息来看,有两个或更多的规则,每次迭代都会用它们的常量替换规则中的变量

对于海龟的解释,这些是标准规则

F : Move turtle forward in current direction (initial direction is up)
+ : rotate turtle clock wise
- : rotate turtle anti clock wise
[ : Push the current state of the turtle onto a pushdown operations stack. 
    The information saved on the stack contains the turtle’s position and orientation, 
    and possibly other attributes such as the  color and width of lines being drawn.
] : Pop a state from the stack and make it the current state of the turtle
请考虑本网站所示的例子。代码>http://www.selcukergen.net/ncca_lsystems_research/lsystems.html

Axiom     : FX
Rule      : X= +F-F-F+FX 
Angle     : 45
因此,在n=0时
(忽略axiom中的X)

就是F,意思是一条向上的直线

n=1时的

用规则替换axiom中的X

F+F-F-F+F(再次忽略末尾的X)

输出是这个吗

http://www.selcukergen.net/ncca_lsystems_research/images/noderewrite.jpg
一个简单的例子和一条规则就可以了。但在第25页的《植物的算法之美》一书中,有一些规则我不知道该如何解释

X
X = F[+X]F[-X]+X
F = FF
请看这张图片

https://lh6.googleusercontent.com/g3aPb1SQpvnzvDttsiiBgiUflrj7R2V29-D60IDahJs=w195-h344-no
n=0时的

只有“X”。不知道这意味着什么

n=1时的

应用规则1(X->F[+X]F[-X]+X):F[+]F[-]+忽略所有X。这只是一条直线

应用规则2(F->FF):FF[+]FF[-]。这只是一条直线

根据我的理解,最终输出应该是海龟向上移动四次。或者,最终输出最多只能包含四行

我在网上找到了一个我认为可以帮助我更好地理解这一点的工具,所以我输入了相同的值,下面是n=1时的输出结果

https://lh6.googleusercontent.com/-mj7x0OzoPk4/VK-oMHJsCMI/AAAAAAAAD3o/Qlk_02_goAU/w526-h851-no/Capture%2B2.PNG
输出绝对不是一条直线,最糟糕的是它有5条直线,这意味着最终输出方程中应该有5F

帮助我理解此节点重写。如果不理解这一点,我就无法深入阅读这本书

对不起,这篇文章太长了,还有pre-tag中的链接。我不能发布超过2个链接。
感谢您耐心地从头到尾阅读。

L系统非常简单,依赖于文本替换

使用此起始信息:

Axiom     : FX
Rule      : X= +F-F-F+FX 
然后,基本上,为了生成下一代系统,你采用上一代,并对其中的每个字符应用替换

您可以使用此算法生成:

Axiom : A
Rule  : A = AA
  • 对于上一代中的每个字符:
    • 检查是否有该字符的替换规则
      • 是:附加替换
      • 否:追加原始字符
因此:

如果您有这样的开始:

Axiom : ABA
Rule  : A = AB
那么你会有这个:

        +--------+
        |        |
n(0) = ABA       |
       | |       |
       | ++      |
       |  |      |
       vv vv     |
n(1) = ABBAB     |
         ^       |
         +-------+
基本上:

  • 对于X代中的每个A,在生成X+1代时,输出AB
  • 对于没有规则的其他字符,只需输出该字符(这将处理所有B)
这将是一个系统,每一代的长度都将翻倍:

Axiom : A
Rule  : A = AA
将创造:

n(0) = A
n(1) = AA
n(2) = AAAA
n(3) = AAAAAAAA

区分指示如何绘制分形的命令(案例中的字母)和仅用于规则变异的命令非常重要。这里的
X
是后者,其余的是前者。因此,你不能只是“忽略”X,但你不画它,它对屏幕上的分形没有明显的影响,但它将在规则变异期间用于获得下一代。因此,
FX
意味着画一条线,忽略X。但是你可以变异,F意味着F,X意味着
+F-F-F+FX
。是的。我的意思是忽略在屏幕上绘制,但它将在生成下一个变异规则时使用。我从第一个例子就理解了这一点。但是我们可以看看书中的例子。我无法理解迭代是如何发生的。如果你能告诉我第一次迭代和第二次迭代是什么样子,那将非常有帮助。thanksIt是一个简单的替换规则。生成n(x)时,取n(x-1),对于其中的每个具有替换规则的字符,将其替换为规则值。当n(0)=“FX”和“X=+F-F-F+FX”时,n(1)变成“F+F-F-F+FX”。n(2)变成“F+F-F-F+F+F-F-F+FX”,每次你用它的值替换每个X(包括一个新的X)。可能有多个替换规则,因此您通常会一次循环输入一个字符,如果您对该字符有替换,则输出该字符,否则只输出该字符。记住这些规则,请告诉我n(1)和n(2)次迭代。xx=F[+X]F[-X]+xf=FF根据我的理解,我只需要替换n(0)=xn(1)=FF[+X]FF[-X]+X如果我画这个,那么它看起来就像一条向上的直线,长度为4个单位。但在发电机中,输出看起来不同。n(2)=对不起,我的错。实际的n(2)方程给出了正确的输出,如迭代1时l系统在线生成器所示。这就是我所有困惑的根源,谢谢你的解释。让我明白了很多事情。()但是有一个疑问,如果有超过1条规则,那么替代顺序是否必须与规则顺序相同?或者它可以是任意顺序的?每个字符不能有多个规则。因为你在做每个字符的替换,所以顺序没有任何意义。