4.8 分形(一)

大自然中存在着各种形状,有些规则的早就被我们关注并命名——圆形、三角形、正方形……,但有一大类广泛存在的形状却被熟视无睹了。从曲折的海岸线到嶙峋的山峦,再到千变万化的云团……,尽管它们的形状是不规则的,但如果用不同倍数的望远镜来观察,会发现它们的形态几乎保持不变,即它们的部分特征与整体特征相似。直到1975年,数学家芒德勃罗(B.B.Mandelbrot)才把这些自我相似的形体称为分形 (fractal)。

分形在任意小的尺度上都能有精细的结构,太不规则,以至难以用传统欧氏几何的语言来描述,通常被认为是无限复杂的,可以分成数个部分,且每一部分都(至少会大略)是整体缩小尺寸的形状,即自相似。她的自相似性又揭示了一种新的对称性——画面的局部与更大范围的局部的对称,或说局部与整体的对称。这种对称不同于欧几里德几何对称,而是大小比例的对称,系统中的每一元素,都反映和含有整个系统的性质和信息。

分形无处不在,无处不有。有学者这样说过:“为什么世界这么美丽,因为我眼睛看到的都是分形”。分形几何不仅展示了数学之美,让人们感悟到科学与艺术的融合,也揭示了世界的本质,改变了人们理解自然奥秘的方式。

中小学的教材中已有多处使用分形图,老师有必要对此有所了解。为此,本课简单地介绍一些经典分形的图霸制作方法,更多分形知识请学习有关专著。

林氏系统(LS)

L-系统是由美国生物学家林登迈耶(A.Lindenmayer,1929-1989) 针对植物的进化和造型提出的,现在是计算机模拟自然景物的有效方法,当然也是常用的分形生成方法。

L-系统是由若干符号组成的语言提示系统,最常用的符号是:

F:按给定的长度向前画出一条线段; f:按给定的长度向前移动(不画)一条线段; +:左转(逆时针方向)一个给定的角度; -:右转(顺时针方向)一个给定的角度; |:反向180°;[:把当前画图格式放进栈里; ]:退出画栈,并回到左方括号"["前的画图状态;……

考虑景物与人行走的方向性时,F被L、R代替,L:左向走,景物在左手边 ┷ ;R:右向走,景物在右手边 ┯;这时的生成元也分为左生成元与右生成元。在步长不等时,可以在括号中注明,如F(d): 向前移一步,步长为d。

有人把这种前进(F)、左拐(+)、右拐(-)的进行方式称为龟行几何,这种方法当然也可以推广到3D空间,用三个向量H、U、L指示龟的朝向。H表示向前(Heading), U表示向上(Up),L表示向左(Left)。

在图霸中,我们将要素简化成两个:初始元、生成元。初始元如折线、三角形、正方形等。例如,著名的柯赫雪花曲线的初始元为一正三角形,而树木花草的初始元由折线组合而成,生成元是由n个边长均为d的开的有向折线组成的。因此,构造的每个阶段都从折线开始,用生成元代替每个直线段,压缩生成元,并把它们放在与原来直线段有相同端点的位置上。它和代数系统的迭代过程相对应,因此极限图形(或迭代的不变集)就是所要的模拟结果。即,分形=初始元+生成元+迭代。下面通过实例学习理解。

例4.8.1:柯赫(Koch)曲线—对海岸线的模拟(简单向前生成元格式的LS分形)

1904年,瑞典数学家柯赫(H.von Koch,1870-1924)构造出柯赫曲线。如果首尾闭合,这种曲线常称作柯赫“雪花曲线”(snowflake curve)。

柯赫曲线的生成过程很简单。先给出一条线段作为原始形状,然后使中间1/3向外折起,生成一个4边的对象。第二步在此基础上,将每个小边中间1/3去掉并向外折起。以后重复此操作。经过无穷次操作就得到极限图形——柯赫曲线,它是长度无限大、处处连续而不可微的曲线。仔细观察它,可以看出整个曲线与它的四个部分完全相似。在分形几何中,维数可以不是整数,叫做分维,柯赫曲线的维数是ln(4)/ln(3)≈1.26186。

用L-S描述:

压缩因子: 1/3

角度:60°

符号重写过程即迭代的过程:FF+F--F+FF+F--F+F+F+F--F+F--F+F--F+F+F+F--F+FF+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F+F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F+F+F--F+F+F+F--F+F--F+F--F+F+F+F--F+F……

如果初始元为F--F--F,得到的就是雪花曲线。

制作步骤:

1. 【点】工具添加两个自由点A、B,【线】工具连结AB,浅蓝色。选取点A、B,【构造-点-分点-三等分点】C、D。以C为中心,把点D旋转60度得点E。【新建参数】n,整数,从0到5。生成元中不要连线,它将由初始元中的线代换。

2. 选取点A、B,【迭代】,四重映射A、B到A、C,C、E,E、D,D、B。选取参数n和迭代,【属性】对话框的“创建”中仅勾选AB,取消“显示完整迭代”,只显示最终迭代,确定。隐藏线段AB,拖动参数n的滑块,原来的一条线段被四条代换,每条长度是原来的三分之一。学习了“自定义工具”后,可以把这个柯赫曲线制成工具,然后匹配到等边三角形的三边上,得到雪花曲线。

例4.8.2:连续单曲线的谢尔宾斯基三角形(左右生成元混合格式的LS分形)

1915-1916年,波兰数学家谢尔宾斯基(W.Sierpinski,1882-1969)构造了谢氏三角、地毯、海绵、墓垛,它们不但有趣,而且有助于形象地理解分形。

参考例4.7.3,将三角形ABC改为等边三角形,三点D、E、F为三边中点,用三重迭代,可以很容易制作下图左侧的谢氏三角。

本例主要介绍左右格式生成元的LS分形的迭代方法。由于初始元为L,所以一开始为单位长线段AB,接下来把它用左生成元代替,生成一级图。然后把其中的R用右生成元代换,L用左生成元代换。在图霸中,右生成元也可以逆向压缩左生成元得到,迭代时注意映射的顺序即可。

制作步骤:

1. 【点】工具添加两个自由点A、B,【线】工具连结AB,浅蓝色,这是初始元。点B以点A为中心旋转60°得点C,分别以A、B为中心, 0.5为比缩放C得D、E,隐藏C,得左生成元,见上图(顺次四点ADEB,不用连线)。

2. 将初始元线段AB依次压缩到DA、DE、BE,即作A、B→D、A,A、B→D、E、A、B→B、E的最终迭代,隐藏初始元和各点,得连续单曲线LS-Serpinsli三角。选取迭代图,按键盘上的加减号键可以改变迭代深度。前六级图如下:

例4.8.3:希尔伯特(Hilbert)曲线

希尔伯特曲线是一种能填充满一个平面正方形的分形曲线(空间填充曲线),由大卫·希尔伯特在1891年提出。1890年,意大利数学家皮亚诺(Peano G)发明能填满一个正方形的曲线,叫做皮亚诺曲线。皮亚诺对区间[0,1]上的点和正方形上的点的对应作了详细的数学描述。后来,由希尔伯特作出了这条曲线。一般人认为,一维的东西是不可能填满2维的方格的,但是皮亚诺曲线恰恰给出了反例。

制作步骤:

1. 【二维】视图,【点】工具添加两个自由点A、B,选取后【构造-中点】C,点A绕点C旋转90度到点D,点C关于点D反射到点E,点A按向量CD平移到点F。

2. 【新建参数】n,整数,从0到6,【新建参数】t,整数,不显示滑块,当前值为0。选取n和t,【计算】:if(No2<=0,1/2^(No1+1),2*No2),改标签为自定义文本格式k,开始时,k值为1/2^(n+1),以后每次放大2倍。选取k,标志为伸缩比。点A、B以点D为中心,按比k伸缩得点A'、B',连结A'B'。点C、E以F为中心,k为比伸缩得点C'、E',连结C'E'。线段C'E'关于点D反射得线段C"E"。

3. 选取A、B、t,【迭代】,4重映射:A、B、t依次映射到A、C、k,C、B、k,D、E、k,E、D、k。

4. 选取n和迭代,【属性】,只创建三条线段的象,不显示数据表。隐藏迭代标签,隐藏点的标签。

5. 隐藏除A、B外的所有点、参数t及k。保存文件,拖动n。修改n的值,你的n最大能达到多大?电脑性能越好,n可以越大,注意先保存,防止太大时卡死。下图是1-4阶的希尔伯特曲线,n=8时看上去已经填满。

例4.5.4:丢勒(Durer)五边形

第一个分形实例(仅限于目前的资料)是文艺复兴时期德国著名画家丢勒构造的五边形。他首先画出一个正五边形,然后沿每边向外再作5个正五边形,这样又构成了另一个更大的正五边形轮廓。 现在反过来操作,给定一个大的正五边形,画出内嵌的角上五个和中间的一个小正五边形。不断重复此过程,确实可以得到有无穷自相似结构的分形对象。

法一(正五边形压缩法):

1. 二维视图下添加两个自由点O、A,以点O为中心,把点A旋转72度得点B,把点B旋转72度得点C,把点A旋转-72度得点E,把点E旋转-72度得点D。以O为中心,把A、B、C、D、E按比0.618034((sqrt(5)-1)/2)缩放得点A'、B'、C'、D'、E',把A'按比-0.618034缩放得点A"。选取A、B、C、D、E五点,【线】工具添加五边,【面】工具添加面。新建参数n,整数,从0到15。

2. 选取O、A两点,【迭代】,按下图建立6重映射(如图不要最后的一个映射,得到的就是五角繁星),确定。

3. 选择n及迭代图,【属性】中仅选择创建线与面的象,显示最终迭代。修改线面的颜色,隐藏点线面。

4. 迭代属性中只选择创建面的象,拖动n。

法二(L代码直译法):

丢勒五边形显然有五次旋转对称性,作出五分之一后制成自定义工具比较方便。仔细分析图形,得出初始元线段AB和生成元A-B如下图。

将生成元A-B按如图箭头的指向依次迭代到生成元的各线段上,其中由B"到B"'后又后退到B",再继续向前,若保留B"到B"'的迭代(图中箭头颜色不同),得到的分形为丢勒五边形,而去掉B"到B"'的迭代,得到的则是五角繁星。找出生成元是绘制LS分形的关键。

步骤:

1. 二维视图下添加两个自由点A、B,以A为中心按比0.618034缩放B得B',以B为中心按比0.618034缩放A得A',点B以B'为中心旋转108度得B",点B'以B"为中心旋转108度得B"',连结AB。新建参数n,整数,0到5。

2. 选取A、B,【迭代】,通过如图的6次映射,把生成元压缩到它的各个部分上。如果不加入桔黄色框中的映射就得到五角繁星。

3. 选取迭代图和n,打开【属性】对话框,构成含参数深度的迭代,只创建线AB的象,显示最终迭代,仅显示实线。隐藏含撇号的点、线AB、参数n。选取所有,【常用-自定义-创建新工具】名称“工具#1”(未用过自定义工具的可以参考教程的“自定义工具”部分)。拖动n=1,得到的就是生成元。

4. 复制参数n,【新建页】,【插入-正五边形】,删除五边及面,仅留下五点ABCDE。【粘贴】n。使用【自定义-工具#1】分别匹配顶点A、B、参数n,顶点B、C、参数n,顶点C、D、参数n,顶点D、E、参数n,顶点E、A、参数n,完成后右击鼠标。隐藏点标签,拖动n。

例4.8.5:制作逐级动态生长的H分形。

1. 二维视图,新建参数t,从0到10,新建整型参数k,从0到10。选取k,计算k+1,选取k、t,计算:if(No1<int(No2)||No2%1>0.5,1,2*No2%1),改标签为m。t的整数部分用作迭代的深度,小数部分用于控制线段的生长及延时。

2. 添加两个自由点O、A,以点O为中心,m为比缩放点A得点B,作B关于O对称点C,连结BC,浅蓝色。点O绕点B旋转90度得点D,以点B为中心,sqrt(2)/2为比缩放点D得点E,E关于点O对称点F。

3. 选取点O、A、参数k,迭代,映射到B、E、k+1,增加映射到C、F、k+1。选取迭代和t,属性中勾选只创建BC的象,不显示数据表。拖动k=0,添加t的动画,从0到10,自定义速度0.05。添加t、点O、A的显示隐藏按钮。隐藏迭代标签,隐藏所有点,参数及计算值。点击动画按钮,gif录屏软件录制动态生长过程。

4. 选取迭代,属性中改颜色为“不同深度异色”。

例4.8.6:勾股树

上图形似大树,叫做勾股树,也叫“毕达哥拉斯树”。是根据勾股定理所画出来的一个树形图。 从树干的最下端可以看到一幅勾股定理的图形:一个直角三角形,以及分别以它的每一边为边向外所作的正方形。勾股定理说,斜边上的正方形的面积,等于两个直角边上正方形面积之和。顺着树干和树枝往前看,从一幅勾股定理图中两个小正方形的顶部各自长出一幅新的勾股定理图,这两个是第二代,它们的形状都与第一代勾股定理图完全相同,只是尺寸变小了。 就这样一生二、二生四、四生八,继续繁殖下去,就长成了图中那样的大树。

1. 二维视图下添加两个自由点A、B,点B绕点A旋转90度得点D,插入平行四边形DABC,四边红色,作CD中点E。新建整数参数n,从0到15,新建参数t,从0到pi,标志为角度,计算pi-t。点C绕点E按标志角t旋转得点F。

2. 选取点A、B,参数t,【迭代】,先映射到D、F、pi-t,再增加映射到F、C、pi-t,确定。选取迭代图及参数n,【属性】中加入了深度。修改创建四条线段的象,不显示数据表,仅显示实线,不同深度异色。隐藏点及pi-t,隐藏迭代标签,拖动t及n。效果如上面的题中图。

3. 修线正方形四边为绿色,迭代属性中改为使用原象颜色。添加t的动画,从0.5到pi/2,双向,慢速,循环,间隔1秒。执行动画。t=pi/2时如下图,截图时已经有放缩。

思考:如果构造迭代时原象仅用两点,不选用参数t,这样得到的勾股树与此例有何不同?

例4.8.7:分形树(含分枝结构进退格式的随机型LS分形)

对植物结构的绘制是LS分形中最令人感兴趣的部分,为了得到栩栩如生的效果,可以使用随机数表示分支的位置、长度与角度,四杈树中各分支的角度范围设置如下,你可以适当修改:

树干上的两个分支的起点A1、A4设置在AB的两个黄金分割点P0、P1之间,使用计算0.382+rand(0.236)可以得到[0.382,0.618)之间的随机数。

1. 【二维】视图,新建参数k,整数,0到5。选取k,按下图添加5个计算,第一个用于比值,后四个显示为角度,用于旋转角,对比上面的两幅图加以理解。选取k但并不用于计算式中,只是为了刷新值。由于用了随机函数,拖动k,这些值是不断变化的。

2. 把五个计算式分别改标签为r、a1、a2、a3、a4。作线段AB,AB为初始图元,保持竖直。 以A为中心r为比,伸缩B得点A1,以B为中心r为比,伸缩A得点A4,这两点是关于AB中点对称的。以A1为中心,a1为旋转角,旋转B得B1。以B为中心,a2为旋转角,旋转A4得B2。 以B为中心,a3为旋转角,旋转A1得B3。以A4为中心,a4为旋转角,旋转A得B4。连接A1B1、 BB2、BB3、 A4B4,得生成元如图。

3. 删除五条线段,以A为中心,B旋转固定角90度得B',连结AB',选取k,计算0.2*0.75^k,选取此计算式及线段AB',【对象上绘制点】C,作C关于A对称点C',把C按向量AB平移得点D,以B为中心,固定比0.75缩放点D得点D',作点D'关于点B对称点D"。添加【面】D'CC'D",它是一个以AB为轴的等腰梯形。选取点C,属性中改参数值表示“定距离”,它随着k的增加而指数型的减小,模拟树枝的粗细。隐藏这一步作的所有点线及计算式。

4. 选取k,计算k+1,选取k+1及面,【参数颜色】,对话框中选“灰度”,0到20循环。拖动k,观察树的粗细及颜色变化,最后将k拖到0。新建参数n,整数,0到6。

5. 选取点A、B,参数k,【迭代】,映射到A1、B1、k+1,再增加映射到B、B2、k+1,B、B3、k+1,A4、B4、k+1,确定。选取迭代图及参数n,【属性】中参入了深度。修改只创建面D'CC'D"的象,不显示数据表。隐藏参数k、点及计算,隐藏迭代标签,拖动n,点击鼠标,树的形状随机变化。

练习1:制作谢氏三角、谢氏地毯(下面左侧两图)。

练习2:根据下图左边的提示制作龙图:

修改成逐级动态生长的龙图

练习3:根据左侧的生成元制作连续单曲线雪花图形

练习4:根据生成元制作花篮簇

练习5:制作五角繁星。

练习6:制作窗格

初始元:F+F+F+F

角度δ: 90度

生成元:FF+F+F+F+FF

压缩因子s: 1/3

 

进入下一课

返回帮助目录