| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 网页制作 > Flash教程 > ActionScript教程 > 文章正文 用户登录
[分形几何]L系统编
[分形几何]IFS系统

叩开分形几何这扇门           

叩开分形几何这扇门

作者:佚名 来源:不详 更新: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 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。