
3.4 植物形态模拟
L文法系统,可以用“公理+规则+几何解释”的方式来模拟不同植物的生长形态。下面将介绍几种分形树的L文法系统的生成方式。
3.4.1 分形树
科赫曲线没有断点,没有分叉,是可以一笔绘制而成的。而树则不同,树是有分支结构的,分支结构在某些关键点会出现多个行走方向,所以必须引进“[”和“]”符号来保存和调用每个关键点的信息,以便返回。符号“F”表示树干和分支,每个分支点至少有左、右两个生长方向,“+”表示树枝向左生长,“-”代表树枝向右生长。当遇到分支点时,可以用符号“[”将当前树枝的状态保存下来,当绘制完向左的生长方向后,再用符号“]”把前面保存下来的分支点状态取出来,返回该分支点,继续绘制向右方向的分支。采用这样的方法,可以生成不同的树的形态。
● 分形树1的L文法如下。
V(字母表):F,+,-,[,] ω(公理):F
P(规则集):F->F[-F]F[+F]F δ(角度增量):25°
则,
初始(公理):F。
第一次迭代后的字符串:F[-F]F[+F]F。
第二次迭代后的字符串:F[-F]F[+F]F[-F[-F]F[+F]F]F[-F]F[+F]F[+F[-F]F[+F]F]F [-F]F[+F]F。
在第一次迭代后的字符串上应用规则,+、-、[、] 都保持不变,所有的字符F都替换成F[-F]F[+F]F。
……
打开配套资源中第3章目录下的“L文法系统.py”程序文件,将起始点A的方向改为90°,即将语句:A=(0,0,0) 改为:A=(0,0,90);将语句L_system(dragon,A,L,n)改为L_system(tree1,A,L,n),第一个参数为分形树1的文法结构,将迭代次数n分别设置为1和4,运行程序后,可以分别生成分形树1的生成元和第四次迭代形成的图形,如图3-5和图3-6所示。

图3-5 分形树1生成元

图3-6 分形树1第四次迭代
● 分形树2的L文法如下。
V(字母表):F,+,-,[,] ω(公理):F
P(规则集):F->F[+F]F[-F][F] δ(角度增量):25°
打开配套资源中第3章目录下的“L文法系统.py”程序文件,将起始点A的方向改为90°,即将语句:A=(0,0,0)改为:A=(0,0,90);将语句L_system(dragon,A,L,n)改为L_system(tree2,A,L,n),第一个参数为分形树2的文法结构,将迭代次数n分别设置为1和4,在运行程序后,可以分别生成分形树2的生成元和第四次迭代形成的图形,如图3-7和图3-8所示。

图3-7 分形树2的生成元

图3-8 分形树2的第四次迭代
● 分形树3的L文法如下。
V(字母表):F,X,+,-,[,] ω(公理):X
P(规则):X->F-[[X]+X]+F[+FX]-X δ(角度增量):22.5°
打开配套资源中第3章目录下的“L文法系统.py”程序文件,将起始点A的方向改为90°,即将语句:A=(0,0,0)改为:A=(0,0,90);将语句L_system(dragon,A,L,n)改为L_system(tree3,A,L,n),第一个参数为分形树3的文法结构,将迭代次数n分别设置为1和5,在运行程序后,可以分别生成分形树3的生成元和第五次迭代形成的图形,如图3-9和图3-10所示。

图3-9 分形树3生成元

图3-10 分形树3第五次迭代
● 分形树4的L文法如下。
V(字母表):F,X,Y,+,-,[,] ω(公理):F
P(规则集):规则1:F → FF-[XY]+[XY]
规则2:X →+FY 规则3:Y →-FX
δ(角度增量):22.5°
打开配套资源中第3章目录下的“L文法系统.py”程序文件,将起始点A的方向改为90°,即将语句:A=(0,0,0)改为:A=(0,0,90);将语句L_system(dragon,A,L,n)改为L_system(tree4,A,L,n),第一个参数为分形树4的文法结构,将迭代次数n分别设置为1和5,在运行程序后,可以分别生成分形树4的生成元和第五次迭代形成的图形,如图3-11和图3-12所示。

图3-11 分形树4生成元

图3-12 分形树4第五次迭代
● 分形树5的L文法如下。
V(字母表):F,R,+,-,[,] ω(公理):F
P(规则集):规则1:F → F[-FR-FR-FR]F[+FR+FR+FR]F[FR]
规则2:R → RF[+R][++R][+++R][-R][--R][---R]R
δ(角度增量):22°
打开配套资源中第3章目录下的“L文法系统.py”程序文件,将起始点A的方向改为90°,即将语句:A=(0,0,0) 改为:A=(0,0,90);将语句L_system(dragon,A,L,n)改为L_system(tree5,A,L,n),第一个参数为分形树5的文法结构,将迭代次数n分别设置为1和3,在运行程序后,可以分别生成分形树5的生成元和第三次迭代形成的图形,如图3-13和图3-14所示。

图3-13 分形树5生成元

图3-14 分形树5第三次迭代
● 分形树6的L文法如下。
V(字母表):F,+,-,[,] ω(公理):F
P(规则集):F →+F[+F]--F[---F]+F δ(角度增量):15°
打开配套资源中第3章目录下的“L文法系统.py”程序文件,将起始点A的方向改为90°,即将语句:A=(0,0,0) 改为:A=(0,0,90);将语句L_system(dragon,A,L,n)改为L_system(tree6,A,L,n),第一个参数为分形树6的文法结构,将迭代次数n分别设置为1和4,在运行程序后,可以分别生成分形树6的生成元和第四次迭代形成的图形,如图3-15和图3-16所示。

图3-15 分形树6生成元

图3-16 分形树6第四次迭代
● 分形树7的L文法如下。
V(字母表):F,X,+,-,[,] ω(公理):X
P(规则):规则1:X → F+[[X]-X]-F[-FX]+X 规则2:F → FF
δ(角度增量):25°
打开配套资源中第3章目录下的“L文法系统.py”程序文件,将起始点A的方向改为90°,即将语句:A=(0,0,0)改为:A=(0,0,90);将语句L_system(dragon,A,L,n)改为L_system(tree7,A,L,n),第一个参数为分形树7的文法结构,将迭代次数n分别设置为1和5,在运行程序后,可以分别生成分形树7的生成元和第五次迭代形成的图形,如图3-17和图3-18所示。

图3-17 分形树7生成元

图3-18 分形树7第五次迭代
以上示例仅供参考,读者也可以设计自己的公理和规则,甚至修改、扩充符号的图形学解释,来模拟和生成多种多样的植物形态和分形图。
3.4.2 随机分形树
在L文法定义中,采用不同的规则来代表不同的形态,在迭代替换时,这些形态可以依据不同的概率来随机应用,这样就能够生长出更自然、更生动的随机分形树。以下是一种随机分形树的L文法。
V(字母表):F,+,-,[,] ω(公理):F
P(规则集):规则1:F→F[+F]F[-F]F 概率:0.3
规则2:F→F[+F]F[-F[+F]] 概率:0.4
规则3:F→FF+[+F+F]-[+F] 概率:0.3
δ(角度增量):25°
初始(公理):F
第一次迭代后的字符串:有30%的概率可能是规则1产生的F→F[+F]F[-F]F,有40%的概率可能是规则2产生的F→F[+F]F[-F[+F]],还有30%的概率可能是规则3产生的F→FF+[+F+F]-[+F]。在随机分形树的迭代过程中,每一次迭代只能根据概率,来应用其中的一条规则。所有设定的规则的概率加起来总和必须为100%。在配套资源第3章目录下的“L文法系统-随机.py”程序中采用的方式是:在每一次迭代前,首先生成0~1中的一个随机数,然后根据所生成的随机数,来选择这次迭代替换所要采用的规则。当随机数小于等于0.3时,选择规则1;大于0.3并且小于等于0.7时,选择规则2(因为规则2的概率是0.4);大于0.7时,选择规则3。
第二次迭代后的字符串:同样采用随机数的方式,选择所要替换的规则,每一次程序的运行都有可能选择不同的规则,所以,具体生成的字符串也会不同,所绘制而成的图形也就各具形态。
……
打开配套资源中第3章目录下的“L文法系统-随机.py”程序文件,运行程序,会在指定目录下生成并保存10张后缀名为.png的图形文件(其中每一张图形所设定的迭代次数皆为4)。从10 张图形文件中所选出的3张图形,如图3-19~图3-21所示。

图3-19 随机“树”1

图3-20 随机“树”2

图3-21 随机“树”3
由此可见,这些图形不像之前的图形那样规整,“随机”的加入,让树的生长多了些恣意,一股蓬勃的生命力仿若扑面而来。或许,正是因为有了“随机”,这个世界才充满了活力。