第二章典型的分形曲线与分形集new.docx

上传人:b****8 文档编号:9145676 上传时间:2023-02-03 格式:DOCX 页数:25 大小:227.04KB
下载 相关 举报
第二章典型的分形曲线与分形集new.docx_第1页
第1页 / 共25页
第二章典型的分形曲线与分形集new.docx_第2页
第2页 / 共25页
第二章典型的分形曲线与分形集new.docx_第3页
第3页 / 共25页
第二章典型的分形曲线与分形集new.docx_第4页
第4页 / 共25页
第二章典型的分形曲线与分形集new.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

第二章典型的分形曲线与分形集new.docx

《第二章典型的分形曲线与分形集new.docx》由会员分享,可在线阅读,更多相关《第二章典型的分形曲线与分形集new.docx(25页珍藏版)》请在冰豆网上搜索。

第二章典型的分形曲线与分形集new.docx

第二章典型的分形曲线与分形集new

第二章典型的分形曲线与分形集

19世纪以来,一些著名的数学家在对曲线的深入研究中,创造了一系列结构、性态与传统几何曲线不同的所谓“病态”曲线,例如,VonKoch曲线,Peano曲线,还有Cantor巢、以及Sierpinski填料、地毯和海绵等。

分形几何创立以后,人们发现,这些曲线正是大自然中俯拾皆是的几何对象,例如,海岸线、河川、地形边界曲线、断裂、闪电、山形轮廓等等,它们都是分形曲线,在欧几里德几何学看来,这些曲线是支离破碎的、不成形的因此才被贬为“病态的”(Pathological)曲线,但实际上,近年来在天文学、地学、生物学、物理学、化学、数学的许多研究领域,都发现存在这种“病态的”结构,可见它们在自然界是普遍存在的。

在计算机图形学中,人们也是习惯于用直线。

圆弧、非圆曲线,或用样条曲线来绘制各种对象的外形,其中多数是人类制造的工业产品和建筑物。

但用它们描述自然界的非规则形状,则很不理想。

分形曲线的引人,使计算机绘制曲线的能力得到极大的加强。

本章主要介绍分形曲线及其计算机生成原理与方法,并提供这类分形曲线与分形集合的计算机算法的C语言描述。

2.1VonKoch曲线

1804年,瑞典数学家VonKoch发现了一种曲线,这种曲线有一个奇怪的特性:

它处处连续,但处处不光滑、不可微。

因而在当时认为是一种与常规不同的“病态”曲线,即vonKoch曲线。

如果在一个正三角形上按生成规则生成,则曲线形状像一朵雪花,故又称为Koch雪花曲线。

VonKoch曲线是一种典型的分形曲线,在分形理论的建立过程中,VonKoch曲线具有重要地位。

VonKoch的生成方法如下:

首先,从一个简单的图形出发(这个图形称为源图形),然后按照一定的生成规律不断进行变形,最后可以得到VonKoch曲线。

源图形通常是一条直线或一个多边形,在曲线的生成过程中,其变形的规律是将源图形中的直线段用一段折线来代替,此折线称为生成元。

图2-l(a)所示为生成元,图(b)为通过5次递归(N=5)所生成的VonKoch曲线。

VonKoch曲线的具体生成过程中,由源图形和生成元就可以决定曲线的形态。

源图形为一直线段,生成的曲线如图中所示,可用以绘制海岸线或云彩的边界。

如果源图形为一等边三角形,生成的曲线形状与雪花类似,称为Koch雪花曲线。

由Koch曲线的生成过程知道:

在极限的情形下,每小段折线的长度趋于无穷小,因而此曲线是一条无处不连续但处处不可微的曲线,其上任一点处,均无确定的切线,曲线的长度趋于无穷。

图2-1(b)的曲线是一闭合曲线。

对于koch雪花曲线,可以证明它的面积为源多边形的8/5。

Koch曲线的维数,可用相似维数来定义。

由生成曲线的过程可知,从任何一步到下一步,其周长增加为4/3,图2-1(a)中显而易见,整体由四个线段组成,即N=4,a=3,其维数

D=log4/log3=1.2618…

Koch曲线是典型的分形曲线,它具有自相似性。

其中生成元是由n段直线和确定的二个端点组成。

自相似的不变集的曲线段,是通过反复用一生成元的相似图形,来取代每一直线段的递归调用过程而建立起来的。

Koch曲线可以派生为各种形态,用不同的生成元,就可以得到不同类型的结构形态。

下面介绍如何用计算机绘制Koch曲线,算法的基本设计思想是:

根据曲线的生成原理,由于它是通过不断细分递归生成的,因此,采用递归调用方法,由生成元产生Koch曲线。

算法的具体步骤是:

(1)给出递归深度n;

(2)计算生成元递归n次后的最小线元长度d=L/mn,式中L为曲线总长,m为Koch曲线生成元的等分数;

(3)确定Koch曲线的起点;

(4)执行递归子程序,对生成元的各部分进行递归,并绘出曲线。

以维数D=1.2618的Koch曲线为例,曲线的生成元由三等分长度的四个部分组成,不同之处是中间那两段线段的角度,为85°,如图2-2(a)所示。

设逆时针旋转时角度为正,生成元的初始角度为θ,图中已标明生成元各段的位置和角度。

每一段小的线元,其坐标可由下式确定

xn=xn-1+d*cosθ

yn=yn-1+d*sinθ

其中,θ为小的线元的当前角度。

由于koch曲线的生成元由图中所示的四部分线段组成,因此,在计算机生成koch曲线算法的递归调用中,要分别对这四部分进行递归调用。

下面给出koch曲线的生成算法。

VoidGenerat_Koch(n)

功能:

Koch曲线生成元的递归调用子程序

参数说明:

intn:

递归深度

变量说明:

intth:

小线元的当前角度,为全局变量

floatx,y:

小线元的当前坐标值,为全局变量

floatd:

小线元的长度d=L/mn

调用函数说明:

moveto(x,y):

不画线移动到(x,y)

lineto(x,y):

由当前位置画直线到(x,y)

{

if(n==0){

x+=d*cos(th*3.14159/180);

y+=d*sin(th*3.14159/180);

lineto(x,y);

return;}

Generat_Koch(n-1);

th+=85;

Generat_Koch(n-1);

th-=170;

Generat_Koch(n-1);

th+=85;

koch(n-1);

}

在上述算法中使用的递归调用,指的是函数自己调用自己的过程。

采用递归调用能有效地解决那些蕴含着递归关系、且结构复杂问题,并使程序简洁易读,生成较紧凑的代码。

在递归过程中,递归深度越大,则递归函数中用的变量就越多,所以,在递归调用过程中使用了堆栈来存放这些变量。

上述算法中,Generat_Koch(n)是一个递归调用过程,在调用时,先判别n的值,如果n为0,则返回,否则递归调用Generat_Koch(n-1),如此不断进行,直到n等于0,然后递归调用,压入堆栈中的变量从0到n依次出栈,完成本次调用。

图2-2(b)所示为递归调用深度为n=5的Koch曲线。

图2-2VonKoch曲线

(a)生成元;(b)N=5的Koch曲线

同样,图2-3所示的Koch曲线,其生成元由9个部分组成(m=9),每部分线段的长度为r=1/3,其分维数为D=log(m)/log(r)=2.0。

由于此曲线的生成元由9个部分,在递归中,分别对这9个部分进行递归调用。

图2-4为另一种Koch曲线,其生成元由8部分组成,每部分线段的长度为r=1/4,其

分维数D=log(m)/log(r)=1.5。

在递归中共有8个递归调用,递归深度n=3。

2.2Peano-Hilbert曲线

意大利数学家G.Peano在1890年首先研究过一些古代装饰图案,这些图案充满在一个平面上,曲线蜿蜒曲折一气呵成。

在研究这些图案的构图规律后提出了Peano曲线。

这是一种维数为2并能充满整个平面的曲线。

后来,人们又发现这种曲线具有多种形态。

Peano曲线的一种特例是Peano-Hilbert曲线(如图2-5所示),她的初始图形是一单位正方形。

由初始图形出发,通过下面的过程不断生成,其步骤如下:

首先,将正方形四等分,求出各个小正方形的中心,并将它们连接,得到如图2-5(a)所示的折线;

其次,将各个小的正方形再细分为四个相同的小正方形,并连接各小正方形的中心;

……

按照以上的方法不断细分下去,并按一定的规则一一连接,就可得到图2-5所示的Peano-Hilbert曲线。

下面就Peano-Hilbert曲线的生成方法作进一步研究。

其实现过程如下:

(1)设置递归深度;

(2)计算曲线的起点;

(3)确定曲线的范围,即xmin,ymin,xmax,ymax;

(4)执行Peano-Hilbert曲线的递归调用子程序。

下面给出Peano-Hilbert曲线递归调用子程序的C语言描述:

ViodPeano-Hilbert(n,s,x1,y1,x2,y2)

功能:

Peano-Hilbert曲线递归调用子程序

参数说明:

intn:

递归调用深度

ints:

曲线方向控制变量,取±1

floatx1,y1,x2,y2:

给定的x,y变化范围

变量说明:

floatdx:

x方向网格上的间距

floatdy:

y方向网格上的间距

调用函数说明:

pow(2,n):

求2n

moveto(x,y):

从当前点不画线移到(x,y)

lineto(x,y):

从当前点画线移到(x,y)

{

if(n==1){

dx=x2-x1;dy=y2-y1;

lineto(x1+dx/4,y1+dy/4);

lineto(x1+(2-s)*dx/4,y1+(2+s)*dy/4);

lineto(x1+3*dx/4,y1+3*dy/4);

lineto(x1+(2+s)*dx/4,y1+(2-s)*dy/4);

return;

}

if(s>0){

Peano-Hilbert(n-1,-1,x1,y1,(x1+x2)/2,(y1+y2)/2);

Peano-Hilbert(n-1,1,x1,(y1+y2)/2,(x1+x2)/2,y2);

Peano-Hilbert(n-1,1,(x1+x2)/2,(y1+y2)/2,x2,y2);

Peano-Hilbert(n-1,-1,x2,(y1+y2)/2,(x1+x2)/2,y1);

}

else{

Peano-Hilbert(n-1,1,x1,y1,(x1+x2)/2,(y1+y2)/2);

Peano-Hilbert(n-1,-1,(x1+x2)/2,y1,x2,(y1+y2)/2);

Peano-Hilbert(n-1,-1,(x1+x2)/2,(y1+y2)/2,x2,y2);

Peano-Hilbert(n-1,-1,(x1+x2)/2,y2,x1,(y1+y2)/2);

}

}

图2-5示出了在递归调用过程中曲线方向的变化。

在图(a)所示的主矩形区域xmin,ymin,xmax,ymax中,首先将该矩形区域四等分,然后对其边长2n等分,此时网格间隔为

dx=(xmax-xmin)/(2*2n)

dy=(ymax-ymin)/(2*2n)

Peano-Hilbert曲线的起点坐标,由下面关系给出:

x=xmin+dx

y=ymin+dy

随后,递归过程对这四个矩形区域进行递归调用。

其中,每个矩形区域的范围可由已知条件算出。

算法中设置了一个控制曲线的变化方向的参数S,其取值为±1。

当S>0时,曲线变化控制变量S值的变化顺序为:

-1①→1②→1③→-1④

当S<0时,曲线变化控制变量S值的变化顺序为:

1①→-1④→-1③→1②

按上面的顺序执行下去,正好与曲线的走向一致,如图2-5(a)(b)所示。

这里-1①表示①区的S值为-1,1②表示②区的S值为1。

随着S的变化,曲线的方向也跟着变化,同时,用lineto(x,y)不断连接各四等分的点,直到完成整个调用。

图2-6为递归深度为n=5绘出的Peano-Hilbert曲线。

2.3Cantor集

GeorgeCantor(1845-1918)是德国数学家,他于1883年发表了著名的Cantor集,这是一类处处稀疏的几何对象,Cantor集和VonKoch曲线一样,都是典型的分形集合。

在许多数学分支中,以及混沌动力系统、复动力系统,如Julia分形集中,Cantor集均起着非常重要的作用。

2.3.1三等分Cantor集

Cantor集是一个无穷点集,而三等分Cantor集则是最基本的,而且广为人知。

如图2-7所示,在单位区间[0,1]中,首先,将其三等分,去掉中间的一段[1/3,2/3]。

然后再将剩下两段进行三等分,将每一段的中间部分舍弃,……如此不断重复上述过程,其所达到的极限为一个点集,即三分Cantor集。

图2-7是一个示意图,给出了分割次数n≤5时每一步分割与舍弃过程中区间的变化,第n步,子区间个数为2n,长度为1/3n。

2.3.2广义Cantor集

在[0,1]区间,将它等分为m(m≥3)段,保留其中s个线段,2≤S≤m-1,而将其中的m-s个线段,……如此不断继续上述过程,直到无穷,最后留下的点集,就是广义Cantor集。

显然,当m=3,s=2时,就是三分Cantor集。

Cantor集的维数可以用下面公式计算:

D=limlog(s)/log(m)

对于三等分Cantor集,其为数D=0.6309…

2.4Sierpinski三角形、地毯和海棉

WaclawSierpinski(1882-1969)是波兰数学家,也是一位国际上具有较高声望的、有影响的数学家。

在月球上有一座环形山就是以Sierpinski名字命名的。

这里所讲的Sierpinski三角形、地毯和海棉是他于1916年提出来的。

2.4.1Sierpinski三角形

将上一节的三等分Cantor集的构图方法稍加扩展,用于二维平面,如图2-8所示,取

连接各边中点,将原三角形分成四个小三角形,然后挖去中间的一个小三角形,如图2-8(a)所示。

下一步,将剩下的三个小三角形按上面同样的方法继续分割,并舍弃位于中间的那个三角形……,如此不断重复分割与舍弃的过程,就能得到如图2-8(b)所示的结构,由一个中间有大量空隙的三角形构成。

由于形成Sierpinski三角形的过程,是一个不断分割与舍弃的过程,其总的周长,随着分割的不断进行而变得越来越大。

在极限的情况下,其总的周长趋向于无穷大,而总面积则趋向于零。

即,当用一维的尺度去测量时,其值为无穷大,而当用二维尺度去度量时,测得的值为零。

Sierpinski三角形的维数是

D=log3/log2=1.5849……

Sierpinski三角形的英文名词是Gasket,有填料、垫片的意思。

这个模型与统计力学的某些问题有关,因而受到理论工作者的重视。

图中给出的Sierpinski三角形是用计算机绘制的,算法基本设计思想是上述的递归生成过程。

具体的算法如下:

(1)设置递归深度n;

(2)用黑色填充一个三角形,其顶点坐标是(x1,y1),(x2,y2),(x3,y3);

(3)调用Sier_Gasket递归子程序。

Sierpinski三角形递归算法描述如下:

ViodSier_Gasket(n,x1,y1,x2,y2,x3,y3)

功能:

Sierpinski三角形递归调用子程序

参数说明:

intn:

递归深度

floatx1,y1,x2,y2,x3,y3:

三角形顶点坐标

变量说明:

floattri[6]:

数组,存储三角形的顶点坐标

调用函数说明:

Setfilltyle(mode,color):

设置多边形填充类型和颜色

fillpoly(nv,tri):

填充顶点数为nv的多边形

{

if(n==1)return

tri[0]=(x1+x2)/2;tri[1]=(y1+y2)/2;

tri[2]=(x2+x3)/2;tri[3]=(y2+y3)/2;

tri[4]=(x1+x3)/2;tri[5]=(y1+y3)/2;

Setfillstyle(1,WHITE);

Fillpoly(3,tri);

Sier_Gasket(n-1,x1,y1,(x1+x2)/2,(y1+y2)/2,(x1+x3)/2,(y1+y3)/2);

Sier_Gasket(n-1,(x1+x2)/2,(y1+y2)/2,x2,y2,(x2+x3)/2,(y2+y3)/2);

Sier_Gasket(n-1,(x1+x3)/2,(y1+y3)/2,(x2+x3)/2,(y2+y3)/2,x3,y3);

}

在递归过程中,值得指出的是:

这里与前面有所不同,它是从大到小,也就是先挖去三角形边上三个中点构成的三角形,用白色填充,再分别挖去剩下的三个小三角形各边中点构成的三角形。

按这种方式一直递归到n=1为止,递归结束。

否则,还需要分别对没有挖空的三角形继续进行深度为n-1的递归调用。

图2-8给出n=4的Sierpinski三角形。

2.4.2Sierpinski地毯

用类似于上面的方法,可以构造Sierpinski地毯(carpet),其方法如下:

设有一个正方形(如图2-9所示),将每条边三等分,正方形被分为9个面积相等的小的正方形,舍弃其中中央的一个正方形,在将剩下的8个小正方形按照上面同样的方法进行分割与舍弃,如此不断重复这一过程,最终所得就是Sierpinski地毯。

由生成过程可知,Sierpinski地毯也具有自相似性和标度不边性,其维数介于1和2之间,其面积的极限为0。

为了计算为数,设想将此图形沿每边长扩大三倍(L=3),则可得到8倍于原图的图形(K=8),如图2-10所示。

因此其维数

D=logK/logL=1.8927……

Sierpinski地毯递归算法描述如下:

VoidSier_Carpter(x1,y1,x2,y2,n)

功能:

Sierpinski地毯递归调用子程序

参数说明:

floatx1,y1,x2,y2:

矩形对角的两个对角坐标

intn:

递归深度

变量说明:

floatL:

矩形长度

floatW:

矩形宽度

调用函数说明:

bar(x1,y1,x2,y2):

画矩形函数

{

if(n==1)return;

L=x2-x1;W=y2-y1;

Bar(x1+L/3,y1+W/3,x2-L/3,y2-W/3);

Sier_Carpter(x1,y1,x1+L/3,y1+W/3,n-1);

Sier_Carpter(x1+L/3,y1,x2-L/3,y1+W/3,n-1);

Sier_Carpter(x2-L/3,y1,x2,y1+W/3,n-1);

Sier_Carpter(x1,y1+W/3,x1+L/3,y2-W/3,n-1);

Sier_Carpter(x2-L/3,y1+W/3,x2,y2-W/3,n-1);

Sier_Carpter(x1,y2-W/3,x1+L/3,y2,n-1);

Sier_Carpter(x1+L/3,y2-W/3,x2-L/3,y2,n-1);

Sier_Carpter(x2-L/3,y2-W/3,x2,y2,n-1);

}

2.4.3Sierpinski海绵

将一个立方体沿其各个面等分为33=9个小立方体,舍弃位于体心的一个小立方体,以及立方体六个面的中心位置上的那一个小立方体。

然后,将剩下的小立方体按相同的方法分割并舍弃位于各立方体面心和体心处的更小的小立方体……,如此不断继续进行,在极限的情形下,即可得到Sierpinski海绵(Sier-Sponge),其维数因介于2维与3维之间。

维数计算方法与前面相似,设想将每条边扩大三倍(L=3),此时,所得到的新的形体,将比原来的扩大20倍(K=20)。

因此,其维数D=log20/log3=2.7288…。

图2-11是计算机生成的Sierpinski海绵。

为了在计算机上生成Sierpinski海绵,可采用堆积小立方体的方法构造形体,并用画家选法消除隐线。

如图2-12所示,Sierpinski海绵可以看成是由上、中、下三层组成,其上层和下层分别由八个立方体组成,见图2-12(a),每层的当中是空心的。

中层由四个立方体,见图2-12(b),这四个立方体分别位于四个边角上。

在计算机生成此种海绵的算法中,就象砌砖那样从底向上,一层一层地构筑成图2-12(c)那样的基本结构。

在算法中采用了递归调用的方法,使这一操作不断进行下去。

为了在显示时具有较好的立体效果,有必要消除隐线,可以采用画家算法,这是计算机图形学中常用的消隐方法之一,在本例的情况下,画家算法可简叙如下:

先从距视点最远的小立方体开始,由远到近,逐个绘制各立方体,当远、近两处的立方体的投影重叠时,则距视点近的立方体便将远处的立方体盖住,计算机屏幕上将显示近处立方体的颜色。

对上下层,则由下向上逐个处理。

这个过程,就好像画家绘制油画那样,用油彩绘出近处的、而将远处的重叠部分给覆盖住。

下面给出图2-11所示Sierpinski海绵的递归生成算法:

VoidSier-Sier-Spong(n,x,y,d)

功能:

Sierpinski海绵递归调用子程序

参数说明:

intn:

递归深度

intx,y:

小正方体所处的位置

intd:

小正方体的长宽高的大小

变量说明:

intdd,dx:

小正方体边长和投影的位移

调用函数说明:

Cubic(x,y,d):

画长宽高为d位置在(x,y)的正方体

{

if(n==0){Cubic(x,y,d);return;}

dd=d/3;dx=dd*cos(3.14159/4);

Sier-Spong(n-1,x+2*dx,y-2*dx,dd);

Sier-Spong(n-1,x+2*dx+dd,y-2*dx,dd);

Sier-Spong(n-1,x+2*dx+2*dd,y-2*dx,dd);

Sier-Spong(n-1,x+dx,y-dx,dd);

Sier-Spong(n-1,x+dx+2*dd,y-dx,dd);

Sier-Spong(n-1,x,y,dd);

Sier-Spong(n-1,x+dd,y,dd);

Sier-Spong(n-1,x+2*dd,y,dd);

Sier-Spong(n-1,x+2*dx,y-2*dx-dd,dd);

Sier-Spong(n-1,x+2*dx+2*dd,y-2*dx-dd,dd);

Sier-Spong(n-1,x,y-dd,dd);

Sier-Spong(n-1,x+2*dd,y-dd,dd);

Sier-Spong(n-1,x+2*dx,y-2*dx-2*dd,dd);

Sier-Spong(n-1,x+2*dx+dd,y-2*dx-2*dd,dd);

Sier-Spong(n-1,x+2*dx+2*dd,y-2*dx-2*dd,dd);

Sier-Spong(n-1,x+dx,y-dx-2*dd,dd);

Sier-Spong(n-1,x+dx+2*dd,y-dx-2*dd,dd);

Sier-Spong(n-1,x,y-2*dd,dd);

Sier-Spong(n-1,x+dd,y-2*dd,dd);

Sier-Spong(n-1,x+2*dd,y-2*dd,dd);

}

2.5随机Koch曲线

前面介绍的分形曲线,称为有规则分形曲线,它们大都是数学家构造出来的,具有确定的变化规律的曲线。

从本节开始,讨论几种无规分形曲线,又称为随机分形曲线。

大自然客观存在的海岸线、地形、河川、以及变化无常的布朗运动轨迹等,是其典型代表。

这类曲线具有普遍性,但是,用传统的几何学方法是无法对它们有效地描述的。

分形几何为这类曲线的描述提供了理论方法。

这类曲线也具有自相似性,但是,这种自相似性具有同纪性质,是通过大量统计而抽象得出的。

另外,它们只有在无标度区域内才有意义,否则,自相似性便不存在。

所谓无标度性是指当标度改变时,该对象在形态、复杂强度、以及不规则性等方面均不发生变化的性质。

例如Koch曲线,当我们用不同倍率

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1