使用MATLAB实现随机分形树模拟
使用MATLAB实现随机分形树模拟 尤鸿霞 (南通纺织职业技术学院,南通,) 摘要:阐述了植物模拟的典型方法L-系统及迭代函数系统(IFS)的基本原理。根据这两种方法,利用Matlab软件工具,模拟了带有随机因子的分形树,模拟的分形树形态生动逼真。Matlab具有强大的绘图工具和函数系统,实现随即分形树模拟的程序很简洁。 关键字:分形树; L-系统; 迭代函数系统 IFS; matlab 中图分类号:TP391.9 文献标识码:A 1 介绍 自然界中种类繁多的植物大都具有自我相似的分形特征。近年来,随着分形理论的发展,分形理论在植物模拟领域得到了广泛的应用。基于分形理论的植物模拟方法主要有L-系统、迭代函数系统、粒子系统等[1]。本文以L系统、迭代函数系统(IFS)的算法思想为基础,以Matlab为编程工具,借助Matlab的绘图功能,实现了随机分形树的模拟。 2分形模拟的实现 2.1 基于L系统的仿真 1968年,著名理论生物学家Lindenmayer,在研究植物形态的进化和构造时,提出了一种文法描述方法作为植物生长的数学理论,即L系统,它能很好地表达植物的分枝特征。之后,各地的研究人员开始关注L-系统,并对其做了各种改进。至今,L-系统仍然是植物模拟的一种重要思想方法。 L-系统是一种符号重写系统,基本思想为字符串替换,其替换规则基本如下:b→a,a→ab。 则其基本演变规律为:b→a→ab→aba→abaab→abaababa→abaababaabaab→……。字符串的增长符合fibonacci数列,即F(n+2)=F(n+1)+F(n)。 L-系统应用于植物模拟时,首先根据其符号元和替换规则产生一系列字符串,然后读取字符,按照不同字符表示的意义来执行不同的动作[2]。简单描述如下: 第一步:生成字符串 1) 声明并设置产生式规则 2) 声明并设置起始点、初始角、迭代步长以及迭代上限等控制参数 3) 循环用替换字符串替换种子 第二步:读取字符并画图 4) 逐个读取字符串中的每个字符 5) 根据读取到的字符采取不同的动作 读取’F’时,画线段; 读取’+’时,逆时针旋转 读取’-’时,顺时针旋转 读取’[’时,进栈,记录当前状态 读取’]’时,出栈 图1为笔者用matlab为平台实现的基于L-系统思想的分形树,其产生式规则分别为FF[-F+F+F]+[+F-F-F]、F[+F]F[-F]F、 F[+F]F[-F[+F]]。 图1 不同生成规则的分形树 随着植物模拟技术的发展,一些研究者提出在分形树的基础上加入随机因子,这样的生成树就不是完全按照某一确定的规则,体现了自然界由于外界条件造成的树木生长的偶然性,这样得到的分形树更自然,更逼真。丁永胜等人[3]曾以matlab实现分形树模拟,其分形树是使用单一规则实现的,整棵树采用同一种自相似规则,每一个分枝的分形方法都相同,其生成树的结果如图1。笔者在其基础上,对程序进行了改进,加入了随机因子,整棵树的生成采用三种自相似规则(如程序中的p1、p2和p3),在树木分枝的部位,到底采用哪一种规则生成新的枝干部分,由随机数决定。如function Sltree(n)程序中,使用c=rand(1)函数随机生成一个0~1之间的数字,在分枝部位,如果生成的随机数是0.7~1之间,则采用p1= FF+[+F+F]-[+F] 规则生成新的枝干;若生成的随机数是0.35~0.7,则采用p2= F[+F]F[-F[+F]] 规则生成新的枝干;若生成的随机数是0~0.35,则采用p3= FF-[-F+F+F]+[+F-F-F] 规则生成新的枝干。这样生成的树木体现了自然界的外界条件对树木生长的影响,使树木的外观看起来更加逼真。程序如下: function Sltree(n) S= F ;a=pi/10;A=pi/2;z=0;zA=[0,pi/2]; p3= FF-[-F+F+F]+[+F-F-F] ;p1= FF+[+F+F]-[+F] ;p2= F[+F]F[-F[+F]] ; 图2 随机分形树仿真图 for k=2:n c=rand(1) if c>=0.7 S=strrep(S, F ,p1); elseif c>=0.35 S=strrep(S, F ,p2); else S=strrep(S, F ,p3); end end figure;hold on; for k=1:length(S); switch S(k); case F plot([z,z+2*exp(i*A)], linewidth ,2); z=z+2*exp(i*A); case + A=A+a; case - A=A-a; case [ zA=[zA;[z,A]]; case ] z=zA(end,1); A=zA(end,2); zA(end,:)=[]; otherwise end end 加入了随机因子之后,生成的分形树更具随机性,更逼真。由于具有随机性,每次执行程序,所生成的分形树是具有不同形态的。实验中,还可以根据需求调整生成规则,增加生成规则的数量,调整随机数的范围等,以得到不同的树。 2.2 基于迭代函数系统的仿真 迭代函数系统(IFS)是分形理论的重要分支,将待生成图像由许多整体自相似的小块拼接而成,局部是整体的一个小复制品。主要技术有相似变换及仿射变换。相似变换可放大缩小甚至旋转,但不变形;仿射变换指在不同方向上变化比率不同的比例变换,一般会改变图形中向量的夹角、点与点之间的距离、图形的面积等,可以将图形进行缩放、伸长、剪切、扭曲等。 仿射变换的数学表达式为如下,其中a,b,c,d,e,f 均为实数: 利用IFS方法生成分形图的关键是找出相应的IFS码,根据已有的研究结果,给出如下一组IFS码[4]。本文作者利用matlab工具及这些IFS码,实现了IFS树的模拟。 表1 一组IFS树的IFS码 i a b c d e f 1 -0.04 0 -0.19 -0.47 -0.12 0.3 2 0.65 0 0 0.56 0.06 1.56 3 0.41 0.46 -0.39 0.61 0.46 0.4 4 0.52 -0.35 0.25 0.74 -0.48 0.38 笔者在丁永胜等人[3]的研究结果的基础上,采用不同与丁永胜等人的变换公式,如IFST(N)函数中的变换公式xp=a1*x+b1*y+e1, yp=c1*x+d1*y+f1,根据表1的IFS树的IFS码,并重新调整了随机数的分布,实现生成IFS树,如