用Delphi实现分形图形的绘制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
用Delphi实现分形图形的绘制
[日期:2006-05-27] 来源:作者:[字体:大中小]
公学成
摘要分形理论(fractal theory)是一门新兴边缘学科在油田开发中也得到了广泛的应用。本文对分形几何学进行了初步的探索和研究,并用Delphi语言实现了常用分形图形的IFS 绘制算法。
关键词分形仿射变换迭代IFS
1 关于分形
在二十世纪七十年代,数学家曼德尔勃罗特(B.B.Mandelbrot)在他的著作中探讨了英国的海岸线有多长的问题。这个问题的解决依赖于测量时所使用的尺度,如果用公里作测量单位,从几米到几十米的一些曲折会被忽略;改用米来做单位,测得的总长度会增加,但是一些厘米量级以下的就不能反映出来。由于涨潮落潮使海岸线的水陆分界线具有各种层次的不规则性。海岸线在大小两个方向都有自然的限制,取不列颠岛外缘上几个突出的点,用直线把它们连起来,得到海岸线长度的一种下界。使用比这更长的尺度是没有意义的。还有海沙石的最小尺度是原子和分子,使用更小的尺度也是没有意义的。在这两个自然限度之间,存在着可以变化许多个数量级的“无标度”区。由于长度不是海岸线的定量特征,就要用分维的方法,于是尔勃罗特创立了分形几何学。
其实自然界中许多事物,具有自相似的“层次”结构,在硐肭榭鱿拢 踔辆哂形耷畈愦巍J实钡姆糯蠡蛩跣〖负纬叽纾 鼋峁共⒉桓谋洹2簧俑丛拥奈锢硐窒螅 澈缶褪欠从匙耪饫嗖愦谓峁沟姆中渭负窝АH缥锢硌е械耐牧鳌⒑0断叩男巫础⒁黄 稚踔涟 ɡ嗨欺飞朴吞镎庵址蔷 实夭愕母飨畹厍蛭锢聿问 ⒉饩 摺⒐杉弁嫉取6 哉庑┫窒蟮拿枋龊脱芯烤捅
匦胗梅中渭负蔚姆椒ā?lt;/DIV>
1.1 分数维的概念
我们知道0维是点,一维是线,二维是面,三维是空间。一条直线段是一维的,由四条这样的直线段组成的正方形是二维的。六个这样的正方形组成的正方体是三维的。直线的长度数值,正方形的面积数值和立方体的体积数值都和我们测量的单位有关。测量的单位也往往是我们所能分辨的最小单位。假设我们的分辨能力增加了一倍,因此我们把直线段长度单位减小到原单位的一半,直线段长度的计量值就变为原来的两倍,正方形面积就变为原来的四倍,体积则变为原来的八倍。我们有下式: log4/log2=2 log8/log2=3 如下图1
图1
这里的2和3不是巧合,这是另一种维数的定义:测度维的概念。为了定量地描述客观事物的“非规则”程度,1919年,数学家从测度的角度引入了维数概念,将维数从整数扩大到分数,从而突破了一般拓扑集维数为整数的界限。即如果某图形是由把原图缩小为1/a的相似的b个图形所组成,有:a^D=b,D就是维数,即D=logb/loga。回到海岸线长度的问题,当用直线段来近似曲线时,长度单位减为原来的一半往往意味着我们可以用长度为原来的二分之一的直线段来近似曲线。这时,海岸线长度增加程度近似于一个固定的倍数。对于英国海岸线来说,其值约为2.7,而log2.7/log2=1.41,1.41就是英国海岸线的维数。1.41由于是一个分式所得出的比值,因此人们称之为分数维。还有其他一些分数维的定义方法,但得出的结果都比较近似。分数维是衡量分形的基本参数之一。
1.2 分形的特点
一般来说分形集满足以下条件(1)、具有任意尺度下的比例细节(2)、不能用传统的几何语言来描述,它既不是满足某些点的轨迹,也不是满足某些简单方程的点集合。(3)、分形具有自相似性,可能是近似的自相似或统计的自相似。(4)、分形维数一般大于它的拓扑维数。(5)、由于具有自相似,分形集合都可以由迭代产生。
图2
1.3 常见的分形图形(如下图2)
2 分形的迭代函数系统方法
函数系统(IFS,简称迭代函数系)方法是美国佐治亚理工学院的巴斯利教授首创的,是分形图形绘制的一种重要方法。IFS的基本思想是选定若干仿射变化,将整体形态变换到局部,随着迭代次数N的增加,就可以得到满意的结果。
度量空间(X,ρ)与定义在其上的有限个压缩映射族ωj:X→X,j=1,2,…,n组成一(双曲)迭代函数系,用IFS表示它,如果ωn的压缩比C j
其中h(T,G)表示距离,G为IFS的吸引子。根据此公式,只要仿射变换选择得当,迭代的结果可以使得目标图像与吸引子任意接近。仿射变换是一种线形变换,在二纬平面上进行讨论,二维仿射变换的形式为:
R:
X’=a*x+b*y+e
Y’=c*x+d*y+f
上式中未知数有两个:x和y;系数有四个:a,b,c和d:常数有两个:e和f。设平面上有一面积区域D,经过仿射变换R变换后变成D’,则D和D’面积关系为:
S(D’)=|det(A)|*S(D)
这里|det(A)|为矩阵A的行列式的绝对值,它是小于1的正数,其中A为系数矩阵。对于不同的R_i(I=1,2,…,N),有相应的A_I(a_i,b_i,c_i,d_i组成),相应的常数e_i和f_i.通常N取2,3,4,有时高达16。
接着要解决的问题是怎样实现随机迭代的问题,由于在计算机中很容易实现用随机数发生器不断生产随机数。假设N=4,每次用计算机生成一个随机数E∈(0,100),设0<β1<β2 <β3<100,做如下规定:
若0 若β1 若β2 若β3 指定βi的过程,就相当于为每种迭代指定一个概率P_i。虽然说每次用哪个规则不确定,但随着迭代次数的增加每种规则使用的频率是一定的。 3 算法实现 运用仿射变换和IFS的方法,用DELPHI语言实现了分形树曲线的绘制。 首先要确定四种不同的仿射变换R1,R2,R3,R4即 A_1(a_1,b_1,c_1,d_1) A_2(a_2,b_2,c_2,d_2) A_3(a_3,b_3,c_3,d_3) A_4(a_4,b_4,c_4,d_4) 以及对应的e_i,f_i和概率p_i,根据分形树的特点,结合IFS的规则做以下的假设: R1:A_1(0,0,0,0.5),e=0,f=0,0 R2:A_2(0.42,-0.42,0.5,0.42),e=0,f=0.2,0=0.05 R3:A_3(-0.42,0.42,0.5,0.42),e=0,f=-0.2,0=0.45 R4:A_4(0,0.1,0,0.2),e=0,f=0,0=0.85 当然可以根据需要变换系数,在实际的编程中,变换不同的行列式可以得到不同的分形树的形状如下图。按照这种迭代方法迭代10000次得到的分形树图如下图3,如果改变相应的系数则得到如下图4的分形树。 图3 图4 实现这种算法的流程图如下图5所示: