L系统节点重写示例

时间:2015-01-09 10:11:59

标签: algorithm fractals procedural-programming procedural-generation l-systems

这是我在stackover流程中的第一篇文章。 最近我开始阅读这本名为“植物的算法之美”的书,在第1章中,他解释了L系统。 (您可以阅读here章节。)

据我所知,有两种类型的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

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

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

at n=1

用规则

替换公理中的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

at n=0

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

at n=1

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

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

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

我找到了一个在线L-system generator,我认为这将帮助我更好地理解这一点,所以我输入了相同的值,这是输出在n = 1时的样子

https://lh6.googleusercontent.com/-mj7x0OzoPk4/VK-oMHJsCMI/AAAAAAAAD3o/Qlk_02_goAU/w526-h851-no/Capture%2B2.PNG

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

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

对于长篇文章以及预标记中的链接感到抱歉。我不能发布超过2个链接。 感谢您耐心从上到下阅读。

1 个答案:

答案 0 :(得分:4)

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

有了这个开始的信息:

Axiom     : FX
Rule      : X= +F-F-F+FX 

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

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

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

因此:

n(0) = FX

            +-- from the X
            |
        v---+---v
n(1) = F+F-F-F+FX
       ^
       +- the original F

如果你有这个开头的话:

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