叩开分形几何这扇门 |
| 作者:佚名 来源:不详 更新:2007-1-13 20:45:59 错误报告 我要投稿 |
随着科学研究的深入,人们发现,在各门学科,都出现了用传统的基于分析,基于函数的数学手段难以解决的问题,如股市走势的预测,蝴蝶效应等,它们都具有非线性系统的特征。在物理学,地球科学等领域,非线性系统的研究已着有呈效,而这些非线性的现象,也被加上一个很玄忽的名字---”混沌”. 今天,我所尝试的,是非线性领域中相当吸引人的一个分枝---分形几何.它的根基是数学,但表现出来的,又是艺术的美感,真是令人叹为观止. 分形几何说的是这样一类具有自相似性的图形,把一个图象的具部放大后,它的具部呈现和原来的整体一致的自相似结构. 网上关于分形几何的比较好的网站: 分形屏道 http://fractal.com.cn/net/index.asp 分形艺术: http://www.fractal.net.cn/fractal/main_c.htm 有了这两个网站的介绍,我就可以省去不少不必要的口舌了. 关键的来讲一下分形图形的绘制原理: 其实,这理的绘制原理是相当简单的,那就是迭代法. 迭代,大家都知道吧,就是xk_1=f(xk). 这里的迭代是在复平面上展开,就是对复数的迭代. 迭代的结果有三种: a)趋进于0 b)是趋进于正无穷大 c)介于两者之间. 迭代的式子相当的简单:假如复平面上的点用y=xk+yk*i来表示:设一个常复数为:C=p+q*i 则主迭代式为: Xk_1=Xk^2-Yk^2+p Yk_1=2Xk*Xk+q 再加上相应的迭代初始及迭代退出条件,即可完成迭代过程. 这里要做是只是对在显示范围内的每个点都施加这样的迭代,根据退出迭代的状不同,决定着何种颜色. 我这里主要尝试的是最经典的J集和M集的绘制.细节请看我下面的程序以及上面两个网站. 在Flash中要实现这样的在对显示范围内的每个点的绘图是不能用一个双层循环就可以解决问题的,原因在于,这种图稍大一点,对于Flash的处理速度而言,都要画上以分钟为单位的时间,这样,Flash除了僵掉外没有第二种可能,甚至还可以让你的机器当掉.所以,必须另寻出路,那就是用setInterval来画图,比如一次setInterval让它画30个点,经实践,这样的处理方案还是可行的. 下面给出我程序中的最关键的绘制M集和J集的程序段:
Function drawJSet2(inZn:ComplexNum,inC0:ComplexNum,inD:Number,inXmin:Number,inY min:Number,intervalId:Number):Void { var intervalIterUp:Number=25; var intervalIterTimes:Number=0; var tmpZx:Number=0; var tmpZy:Number=0; var iteratorNum:Number=0; while(intervalIterTimes<intervalIterUp) { /*data initializations J Set*/ iteratorNum=0; inZn.real=inXmin+_root.gI[intervalId]*_root.gDetaX[intervalId]; inZn.img=inYmin+_root.gJ[intervalId]*_root.gDetaY[intervalId]; do { tmpZx=inZn.real; tmpZy=inZn.img; inZn.real=tmpZx*tmpZx-tmpZy*tmpZy+inC0.real; inZn.img=2*tmpZx*tmpZy+inC0.img; iteratorNum++; } while((tmpZx*tmpZx+tmpZy*tmpZy)<inD&&iteratorNum<_root.gIterLimit) if(iteratorNum==_root.gIterLimit)//shou lian { drawNode(gXOffset+gI[intervalId],gYOffset+gJ[intervalId],Number(_root.gColorArr[0])); } else if((tmpZx*tmpZx+tmpZy*tmpZy)>=inD)//fa san. { if(_root.gDrawColorFul)drawNode(gXOffset+gI[intervalId],gYOffset+gJ[intervalId],Number(_root.gColorArr[iteratorNum])); } //iterator consult _root.gJ[intervalId]++; if(_root.gJ[intervalId]>=_root.gJLimit[intervalId]) { _root.gI[intervalId]++; _root.gJ[intervalId]=0; } if(_root.gI[intervalId]>=_root.gILimit[intervalId]) { clearInterval(_root.gIntervalID[intervalId]); //trace("hi"); _root.gTimeEnd=getTimer(); _root.gTimeTween=_root.gTimeEnd-_root.gTimeStart; trace("time collasped:"+String(_root.gTimeTween)+"ms\n"); trace3("time collasped:"+String(_root.gTimeTween)+"ms\n"); } intervalIterTimes++; } }
Function drawMSet2(inZn:ComplexNum,inC0:ComplexNum,inD:Number,inXmin:Number, inYmin:Number,intervalId:Number):Void { var intervalIterUp:Number=25; var intervalIterTimes:Number=0; var tmpZx:Number=0; var tmpZy:Number=0; var iteratorNum:Number=0; while(intervalIterTimes<intervalIterUp) { /*data initializations MSet*/ iteratorNum=0; inC0.real=inXmin+_root.gI[intervalId]*_root.gDetaX[intervalId]; inC0.img=inYmin+_root.gJ[intervalId]*_root.gDetaY[intervalId]; inZn.real=0; inZn.img=0; do { tmpZx=inZn.real; tmpZy=inZn.img; inZn.real=tmpZx*tmpZx-tmpZy*tmpZy+inC0.real; inZn.img=2*tmpZx*tmpZy+inC0.img; iteratorNum++; } while((tmpZx*tmpZx+tmpZy*tmpZy)<inD&&iteratorNum<_root.gIterLimit) //trace(String(inZn.img)+","+String(inZn.real)); if(iteratorNum==_root.gIterLimit)//shou lian { drawNode(gXOffset+gI[intervalId],gYOffset+gJ[intervalId],Number(_root.gColorArr[0])); } else if((tmpZx*tmpZx+tmpZy*tmpZy)>=inD)//fa san. { //trace(_root.gDrawColorFul); if(_root.gDrawColorFul)drawNode(gXOffset+gI[intervalId],gYOffset+gJ[intervalId],Number(_root.gColorArr[iteratorNum])); } //iterator consult _root.gJ[intervalId]++; if(_root.gJ[intervalId]>=_root.gJLimit[intervalId]) { _root.gI[intervalId]++; _root.gJ[intervalId]=0; } if(_root.gI[intervalId]>=_root.gILimit[intervalId]) { clearInterval(_root.gIntervalID[intervalId]); _root.gTimeEnd=getTimer(); _root.gTimeTween=_root.gTimeEnd-_root.gTimeStart; trace("time collasped:"+String(_root.gTimeTween)+"ms\n"); trace3("time collasped:"+String(_root.gTimeTween)+"ms\n"); } intervalIterTimes++; } } 下面是几张我绘制的图像: 作品1: 类型: J集 大小: 400*400 初始值: C0=0-1i 渲染耗时:57309ms 
下面是几张我绘制的图像: 作品1: 类型: J集 大小: 400*400 初始值: C0=0-1i 渲染耗时:57309ms 
作品2 类型: M集(Mandbrot图形) 大小: 200*200 渲染耗时:533854ms 
|
|
| 文章录入:skyuu 责任编辑:skyuu |
|
| 【字体:小 大】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 |