[分形几何]叩开分形几何这扇门

[分形几何]叩开分形几何这扇门

                                                                                                  By EmilMatthew 05/10/19

       随着科学研究的深入,人们发现,在各门学科,都出现了用传统的基于分析,基于函数的数学手段难以解决的问题,如股市走势的预测,蝴蝶效应等,它们都具有非线性系统的特征。在物理学,地球科学等领域,非线性系统的研究已着有呈效,而这些非线性的现象,也被加上一个很玄忽的名字---”混沌”.

今天,我所尝试的,是非线性领域中相当吸引人的一个分枝---分形几何.

分形几何说的是这样一类具有自相似性的图形,把一个图象的具部放大后,它的具部呈现和原来的整体一致的自相似结构. 它的根基是数学,但表现出来的,又是艺术的美感,真是令人叹为观止.

网上关于分形几何的比较好的网站:

分形屏道

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作品2: http://emilmatthew.51.net/downloads/J1.rar

类型:    J

大小:    400*400

初始值:  C0=0-1i

渲染耗时:57309ms

 

 

2作品1: http://emilmatthew.51.net/downloads/M1.rar

 

 

类型:      M(Mandbrot图形)

大小:  200*200

渲染耗时:533854ms

 

 

 

 

源码下载:

http://emilmatthew.51.net/downloads/fractal.rar

    //如果上面这个链接无法响应下载(有可能是被网站给屏蔽掉了),则可使用下载工具(如迅雷等)下载。

欢迎提出批评与指正意见!

 

 

 

 

你可能感兴趣的:(c,String,function,Flash,图形,下载工具)