基于分形技术的竹生长模拟研究

2013-04-16 10:44
电子世界 2013年5期
关键词:侧枝分枝分形

自然景物在外部形态上呈现出千姿百态,其生长都具有一定的盲目性,但是分枝模式总有规律可循,对这些结构进行具体的放大会发现不规则程度是一样的,即他们的自相似性。分形以其独特的手段来解决不规则形态物体的仿真问题,利用空间结构的对称性和自相似性,可以将自然界中绝大多数的非规则图形真实地在计算机上再现。自然界中大多数树木和草的分叉结构都具有分形的性质,为计算机分形模拟提供了基础。据此如何真实地描述竹子的生长变化过程,本文在算法及实现上做了一些研究。

1.主要的相关技术

1.1 分形模拟方法

分形作为一种方法,在图形学领域主要是利用迭代、递归等技术来实现某一具体的分形构造。它的主要任务是以分形几何学为数学基础,构造非规则的几何图素,从而实现分形体的可视化,以及对自然景物的逼真模拟。

植物的分形模拟就是基于分形理论的植物形态模拟,其原理是利用植物自身结构的分形性质(结构的自相似性)生成植物图形或图像的方法。当前,分形植物模拟的方法主要有L-系统、迭代函数系统(Iterated Function System,IFS)、受限扩散凝聚(Diffusion Limited Aggregation,DLA)模型和粒子系统。这四种方法的算法原理互不相同,模拟对象也是各有侧重。

1.2 IFS(迭代函数系统)

迭代函数系统是从一个坐标系到另一个坐标系的映射系统,其算法分为确定性算法和随机性算法。

确定性算法是指用以迭代的规则是确定性的,它们由一组仿射变换(如R1,R2,R3等)构成。随机性的算法,又被人们称为混沌游戏,指迭代过程是不确定的,每一次迭代采用哪一个规则,即Ri(i=1∽N)中具体哪一个,不是预先定好的,而是类似靠掷骰子的办法来决定。也既是说,随机地从Ri(i=1∽N)中选一个迭代规则迭代一次,再从Ri(i=1∽N)中选一个迭代一次,依此类推,那么最终的生成图形是Ri(i=1∽N)中各个迭代规则的并集。令最终生成的图形为M,它要满足如下集合关系:M=R1∪R2∪…∪RN。

数学上的仿射变换是一种由旋转、平移、映射构成的变换,仿射变换可以由一个函数来表示,这也正是命名“迭代函数系统”的原因。简单地说,迭代函数系统就是指把仿射变换函数系统经过多次迭代形成的分形。

2.竹子的分形生成研究及算法

2.1 分枝模式

虽然植物在外部形态上呈现出千姿百态,但是植物的分枝模式总是有规律可循的,外部形态是其内部某种形态控制机制的反映,而外部形态是可以用植物的分枝模式来描述的。植物的分枝模式分2种,单轴分枝模式和合轴分枝模式。

单轴分枝模式。顶芽不断向上生长,形成主干。同时侧芽也发展成为侧枝,侧枝又以同样方式形成次级侧枝,但侧枝不及主干粗、长。这种分枝模式有明显的主轴,称为单轴分枝模式,单轴分枝的主干上能产生各级分枝,主干的伸长和粗细比侧枝强得多。因此这种分枝模式主干特征显著,如竹子、松树、云杉、杨树等。

合轴分枝模式。顶芽发育一定时期后死亡或生长缓慢,而位于顶芽下面的侧枝就取而代之,继续发育,形成强壮的侧枝,连接在原来的主轴上。之后,这种侧枝上的顶芽又停止发育,再由它下面的侧芽来代替,便形成了弯曲的主轴。以这种方式分枝植物的地上部分呈开放状态,典型的如柳树、榆树等等。

2.2 竹干的分形算法

前文提到竹子的生长变化属于单轴分枝模式。本文采用的分形算法为:以一个竹干作为单位来向上依次递归形成竹子,如图1所示。假设最接近地面的那一段竹干AB长为L,并且与地面夹角为a,两侧枝CD、BE与主干的夹角皆为b,侧枝与主干的长度比例为s2。其中主干起点A(x,y),主干终止和右侧枝起点B(x2,y2),右侧枝终点E(x2R,y2R),左侧枝起点C(x1,y1)以及左侧枝终点D(x1L,y1L)。

主要步骤如下:

(1)绘制主干AB,即用画笔描绘曲线(x2,y2)-(x,y);

主干终止B点坐标

x2=x+L*cos(a*Pi),

y2=y+L*sin(a*Pi);

右侧枝终止E点坐标

x2R=x2+L/s2*cos((a+b)*Pi),

y2R=y2+L/s2*sin((a+b)*Pi);

图1 竹干生成的坐标数据

图2 左侧枝中间叶子生成

左侧枝开始C点坐标

x1=x+L/s2*cos(a*Pi),

y1=y+L/s2*sin(a*Pi);

左侧枝终止D点坐标

x1L=x1+L/s2*cos((a-b)*Pi),

y1L=y1+L/s2*sin((a-b)*Pi);

(2)用画笔画出第一节竹干以及两边侧枝的模型,然后将B点坐标作为A点重新计算出第二节竹节的各个侧枝起点以及终点坐标,再用画笔绘图函数完成第二节竹干的绘制,算是一次递归过程。竹干的生成用到了Graphics类库里面的画笔描绘:

●竹干画笔宽度以及绘制竹干

gg.setStroke(new BasicStroke(6));

ig.drawLine((int)x,(int)y,(int)x2,(int)y2);

●侧枝画笔宽度以及绘制侧枝

gg.setStroke(new BasicStroke(2));

ig.drawLine((int)x2,(int)y2,(int)x2R,(int)y2R);

ig.drawLine((int)x1,(int)y1,(int)x1L,(int)y1L);

2.3 竹叶的生成算法

位于侧枝上的叶子也采用了类似的算法,以左侧枝中间的叶子为例,其他的侧枝叶子可以由此递归、迭代产生:

以一个多边形来描绘一片叶子,如图2所示。

假设左侧枝终点作为该叶子的起点,叶子的终点设为(xLLeafEnd,yLLeafEnd),叶子的长度与主干的长度比值0.4,叶子中间突起两点坐标分别为(xLLeafLCenter,yLLeafLCenter)和(xLLeafRCenter,yLLeafRCenter)。

左边叶子的终点坐标

xLLeafEnd=x1+(L/s2+L*0.4)*cos((ab)*Pi);

yLLeafEnd=y1+(L/s2+L*0.4)*sin((ab)*Pi);

左边叶子的中间突起的两点坐标

xLLeafLCenter=x1L+L*0.2*cos((ab)*Pi)/2;

yLLeafLCenter=y1L;

xLLeafRCenter=x1L;

yLLeafRCenter=y1L+L*0.2*sin((ab)*Pi)/2;

算出竹叶的4个点之后就通过绘制、填充多边形来达到竹叶的绘制效果。

叶子的填充用到了Graphics中的多边形绘制以及色彩填充,具体代码如下:

Polygon pointleft=new Polygon();

pointleft.addPoint((int)x1L,(int)y1L);

pointleft.addPoint((int)xLLeafRCenter,(int)yLLeafRCenter);

pointleft.addPoint((int)xLLeafE-nd,(int)yLLeafEnd);

pointleft.addPoint((int)xLLeafLC-enter,(int)yLLeafLCenter);

这样就可以完成第一个竹干以及叶子的绘制,上层的竹干可以由第一节竹干递归、迭代生成。

3.结论

根据竹子的分枝模式,可以采用迭代函数系统中确定性算法与随机性算法相结合的方法动态模拟竹林生长的各种形态,如竹节生长、叶子生长直至树叶枯黄掉落。实验利用Java语言的GUI图形用户界面设计与AWT画图双缓冲,轻松地的完成绘制主干及分支、树叶以及根据生长周期设置树叶颜色变化直至枯黄掉落。此外利用画笔直接描绘出竹干,以及设计一个生长速率变量来控制程序的递归、迭代速度,从而控制竹子的生长速度。在模拟过程中,引入了双缓冲技术对生长动画的描绘,可以让整个生长过程没有出现闪烁,图像更流畅。

实验的难点在于分形图形算法的构造即如何将竹林的生长模式转化成算法来编写程序实现,本文采用分形算法中的L-系统,并且在具体应用中加以适当改进,实验表明技术是可行的,实现方法的效果也是良好的。

本文的生长模式固定,即每一次生长的图形一样,下一步将进一步研究自然性,即分支产生的随机分支偏转角度的随机性。

[1]陈晓,彭国华,杨康.基于分形L系统生成三维景物的算法研究[J].计算机仿真,2009,07.

[2]刘振兴.基于功能-结构和L-系统的植物仿真建模[D].天津:天津工业大学学报,2008.

[3]罗燕,吴中福,郭选昌,吴刚.分形算法的仿真“竹”的实现[J].重庆:重庆大学学报,2010,33(12).

[4]孙博文.分形算法与程序设计——Java实现[M].北京:科学出版社,2004,11.

[5]Lindenmayer,A Mathematical models for cellular interaction in development,Journal of Theoretical Biology,1996:280-315.

[6]孙永香,刘彤,郑永果等.虚拟植物的建模方法[J].系统仿真学报,2006,18(6):0263-04.

猜你喜欢
侧枝分枝分形
一株吊兰
感受分形
短截和摘心对矮砧苹果幼树分枝特性的影响
分形之美
分形——2018芳草地艺术节
西红柿侧枝什么时候疏除好
分形空间上广义凸函数的新Simpson型不等式及应用
西红柿侧枝什么时候疏除好
红花群体自交结实及分枝性状探究
青花菜侧花球留几个为宜