Python绘图指南:分形与数据可视化(全彩)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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,ALn)改为L_system(tree1,ALn),第一个参数为分形树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,ALn)改为L_system(tree2,ALn),第一个参数为分形树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,ALn)改为L_system(tree3,ALn),第一个参数为分形树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,ALn)改为L_system(tree4,ALn),第一个参数为分形树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,ALn)改为L_system(tree5,ALn),第一个参数为分形树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,ALn)改为L_system(tree6,ALn),第一个参数为分形树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,ALn)改为L_system(tree7,ALn),第一个参数为分形树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

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