分享
 
 
 

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

王朝other·作者佚名  2006-02-01
窄屏简体版  字體: |||超大  

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

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

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有