- 1、本文档共5页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使用MATLAB实现随机分形树模拟.
使用MATLAB实现随机分形树模拟
尤鸿霞
(南通纺织职业技术学院,南通,226007)
摘要:阐述了植物模拟的典型方法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]。简单描述如下:
第一步:生成字符串
声明并设置产生式规则
声明并设置起始点、初始角、迭代步长以及迭代上限等控制参数
循环用替换字符串替换种子
第二步:读取字符并画图
逐个读取字符串中的每个字符
根据读取到的字符采取不同的动作
读取’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]];
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
文档评论(0)