l 系统节点重写示例

Pla*_*chi 4 algorithm procedural-programming l-systems procedural-generation fractals

这是我在 stackover 流中的第一篇文章。最近我开始阅读名为“植物的算法之美”的书,其中在第 1 章中,他解释了 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
Run Code Online (Sandbox Code Playgroud)

因此,请考虑本网站中显示的示例。 http://www.selcukergen.net/ncca_lsystems_research/lsystems.html

Axiom     : FX
Rule      : X= +F-F-F+FX 
Angle     : 45
Run Code Online (Sandbox Code Playgroud)

所以at n=0(忽略公理中的 X)

它只是 F 意味着一条直线向上。

at n=1

用规则替换公理中的 X

F+FF-F+F(再次忽略最后的X)

输出是这个

http://www.selcukergen.net/ncca_lsystems_research/images/noderewrite.jpg
Run Code Online (Sandbox Code Playgroud)

一个带有一个规则的简单示例就可以了。但是在第 25 页的“植物的算法之美”一书中,我不知道如何解释一些规则。

X
X = F[+X]F[-X]+X
F = FF
Run Code Online (Sandbox Code Playgroud)

看到这张图片。

https://lh6.googleusercontent.com/g3aPb1SQpvnzvDttsiiBgiUflrj7R2V29-D60IDahJs=w195-h344-no
Run Code Online (Sandbox Code Playgroud)

at n=0

只是'X'。不确定这是什么意思

at n=1

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

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

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

我找到了一个在线L 系统生成器,我认为它可以帮助我更好地理解这一点,因此我输入了相同的值,这是 n=1 时的输出结果

https://lh6.googleusercontent.com/-mj7x0OzoPk4/VK-oMHJsCMI/AAAAAAAAD3o/Qlk_02_goAU/w526-h851-no/Capture%2B2.PNG
Run Code Online (Sandbox Code Playgroud)

输出绝对不是一条直线,最糟糕的是它有 5 条线,这意味着最终输出方程中应该有 5 F。

帮助我理解这个节点重写。不理解这一点,我无法进一步阅读这本书。

很抱歉这篇很长的帖子,以及 pre 标签中的链接。我不能发布超过 2 个链接。感谢您耐心地从上到下阅读它。

ang*_*son 5

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

有了这个起始信息:

Axiom     : FX
Rule      : X= +F-F-F+FX 
Run Code Online (Sandbox Code Playgroud)

然后基本上,要生成系统的下一代,您需要使用上一代并对其中的每个字符应用替换。

您可以使用此算法生成一代:

  • 对于上一代中的每个字符:
    • 检查我们是否有该字符的替换规则
      • 是:附加替换
      • NO:附加原始字符

因此:

n(0) = FX

            +-- from the X
            |
        v---+---v
n(1) = F+F-F-F+FX
       ^
       +- the original F
Run Code Online (Sandbox Code Playgroud)

如果你有这个开始:

Axiom : ABA
Rule  : A = AB
Run Code Online (Sandbox Code Playgroud)

然后你会有这个:

        +--------+
        |        |
n(0) = ABA       |
       | |       |
       | ++      |
       |  |      |
       vv vv     |
n(1) = ABBAB     |
         ^       |
         +-------+
Run Code Online (Sandbox Code Playgroud)

基本上:

  • 对于 X 代中的每一个 A,当产生 X+1 代时,输出 AB
  • 对于没有规则的每个其他字符,只需输出该字符(这将处理所有 B)

这将是一个每代长度加倍的系统:

Axiom : A
Rule  : A = AA
Run Code Online (Sandbox Code Playgroud)

会创造:

n(0) = A
n(1) = AA
n(2) = AAAA
n(3) = AAAAAAAA
Run Code Online (Sandbox Code Playgroud)