void square Cambr double sice intn) 生成Cm3病 square sce) eI CurrentPaint(Curent+2. SquaneCanbrsice3, n+l) SerCunenPoiny Curent Curent+2 sie3 SquareCanbrsice, n +1); erCuentPoint Curente-2sice3 Currenty Square Canbrfsice3, m +1) ■日■ SetCunent t Cuurent Cl 有5) 图2.39等分 antor尘集的前三步构造 ②16等分正方形,保留相隔为2的4个小正方形的情况构造 Cantor尘前N次迭代的算法: (1)生成一个正方形10,迭代次数为n=0; (2保留正方形相隔为2的4个小正方形:生成四个子区间E,E2,E,E4,n=n+1 (3)如果nN分别对E,E2,E3,E重复②2)操作,否则退出。 16等分 Cantor尘的计算机生成图形见图2.4。如果仍以单位正方形为例,按整体图顺时 针行走,其中具体递归实现算法时点(x,y)的游动方向为: (0.0)→ )) 只需修改9等分程序中else下面中的内容即可,迭 代程序如下: Square 6(sice/4 mm+ 1); SerCumentpaint(Curente+size/4, Curenty+sice/2 Square Camtorl6(size/4 n+ 1) SetCumentPoint(Curentr-sie/, Clarent+sce/4) SercumentPoint Curent-siceA4, Cuarent-sce/2) erCumentPoint(Curent, Cummenty-sice/ 4) 16
16 图 2.3 9 等分 Cantor 尘集的前三步构造 void SquareCantor(double size,int n) { /*生成 Cantor 尘的程序*/ if(n>=TIMES) square(size); else { SquareCantor(size/3,n+1); SetCurrentPoint(Currentx+2*size/3,Currenty); SquareCantor(size/3,n+1); SetCurrentPoint(Currentx,Currenty+2*size/3); SquareCantor(size/3,n+1); SetCurrentPoint(Currentx-2*size/3,Currenty); SquareCantor(size/3,n+1); SetCurrentPoint(Currentx,Currenty-2*size/3); } } ② 16 等分正方形,保留相隔为 2的 4 个小正方形的情况构造 Cantor 尘前 N 次迭代的算法: ⑴ 生成一个正方形 E0 ,迭代次数为n=0; ⑵保留正方形相隔为 2 的4 个小正方形;生成四个子区间 1 2 3 4 E E E E , , , ,n=n+1; ⑶ 如果 n<N,分别对 1 2 3 4 E E E E , , , 重复(2)操作,否则退出。 16 等分 Cantor 尘的计算机生成图形见图 2.4。如果仍以单位正方形为例,按整体图顺时 针行走,其中具体递归实现算法时点(x,y)的游动方向为: ( ) ( ) 1 3 1 1 3 1 0,0 ,0 , , 0, 0,0 2 4 2 4 4 4 → → → → → 。 只需修改9等分程序中else下面中的内容即可,迭 代程序如下: SetCurrentPoint(Currentx+size/2,Currenty); SquareCantor16(size/4,n+1); SetCurrentPoint(Currentx+size/4,Currenty+size/2); SquareCantor16(size/4,n+1); SetCurrentPoint(Currentx-size/2,Currenty+size/4); SquareCantor16(size/4,n+1); SetCurrentPoint(Currentx-size/4,Currenty-size/2); SquareCantor16(size/4,n+1); SetCurrentPoint(Currentx,Currenty-size/4);
图2.416等分 Cantor生集的前三步榄造 23Kohn曲线 231Kohn曲线与随机Kohn曲线 Kohn曲线 Kohn曲线是由瑞典数学家Kohn于1904年构造的一个集合对象,它的放缩比例是3,所 以称为三次Koch曲线,我们可以对其进行推广。如果Kohn曲线是首尾相接的闭曲线,则我 们通常称之为Kohn雪花。前面关于 Mandelbrot的介绍中,他曾经多次用Kohn曲线来作为海 岸线的模型,并用随机性修改了这个模型。Kohn曲线过去也被称为是怪异曲线,它是一个处 处没有切线的曲线,也就时说这个曲线处处不可微。下面我们讲述三次Kohn曲线构造的例子 Kohn曲线是在给定一条直线段,首先在去掉正中间的1/3线段,然后代替它的实两个相 交60度角的线段。然后对每个生成的小线段作同样的处理,最后形成的极限曲线就是Kohn 曲线。而Kohn雪花是取一个等边三角形,然后在每条边的正中间的1/3处和Kohn曲线同样 的处理,最后对生成的小边进行无穷操作,形成的极限曲线就是Kohn雪花。 我们看到随着Koh曲线(雪花)的操作次数增加,曲线的欧式长度也呈现规律的增加,仔 细观察编程实现的Koh曲线图可以知道,如果记开始直线的长度为L,那么迭代一次,就增 加L/3的长度,第k次迭代,曲线长度 L,从而当k→>∞时,曲线长度趋于无穷。 对于Kohn雪花它的长度亦如此,而它的所包围的面积却是一个有限值,可以看出Kohn雪花 的边界始终不会超过它生成等边三角形的外接圆,且可以证明出它的各个小菱角彼此不会相 交。由于Kohm曲线(雪花)生成的规则是一个递归的过程,它们具有严格的自相似结构,它们 就是分形,所以可以用相似维数对它们的维数进行计算。如果对Kohn曲线进行比例为4的放 缩可,可以看出它有三个与整体相似的局部,从而维数为log4/log3=-1.2619,Kohn雪花亦然。 下面我们分别来构造生成Kohn曲线和Kohn雪花的算法:(假设迭代次数为N ①Kohn曲线 (1)选定一个初始点,并确定一条直线段的长度为L;n=1 (2)从初始点出发,水平延长L/3长度 (3)逆时针旋转60度角,并延长L3的长度 (4)顺时针旋转120度,并延长L/3的长度 (5)逆时针旋转60度,并延长L/3的长度;n=n+1; (6)如果nN退出,否则计L/3,执行②2~(6) 程序如下:如果选定初始点(100,250),并取长度为400得到图形如2.5 件构造Kom的线的程序 17
17 图 2.4 16等分Cantor 尘集的前三步构造 2.3 Kohn 曲线 2.3.1 Kohn 曲线与随机 Kohn 曲线 ⚫ Kohn 曲线 Kohn 曲线是由瑞典数学家 Kohn 于 1904 年构造的一个集合对象,它的放缩比例是 3,所 以称为三次 Koch 曲线,我们可以对其进行推广。如果 Kohn 曲线是首尾相接的闭曲线,则我 们通常称之为 Kohn 雪花。前面关于 Mandelbrot 的介绍中,他曾经多次用 Kohn 曲线来作为海 岸线的模型,并用随机性修改了这个模型。Kohn 曲线过去也被称为是怪异曲线,它是一个处 处没有切线的曲线,也就时说这个曲线处处不可微。下面我们讲述三次Kohn 曲线构造的例子。 Kohn 曲线是在给定一条直线段,首先在去掉正中间的1/3 线段,然后代替它的实两个相 交 60 度角的线段。然后对每个生成的小线段作同样的处理,最后形成的极限曲线就是 Kohn 曲线。而 Kohn 雪花是取一个等边三角形,然后在每条边的正中间的1/3 处和 Kohn 曲线同样 的处理,最后对生成的小边进行无穷操作,形成的极限曲线就是Kohn 雪花。 我们看到随着 Kohn 曲线(雪花)的操作次数增加,曲线的欧式长度也呈现规律的增加,仔 细观察编程实现的 Kohn 曲线图可以知道,如果记开始直线的长度为 L,那么迭代一次,就增 加 L/3 的长度,第 k 次迭代,曲线长度为 4 3 k L ,从而当 k → 时,曲线长度趋于无穷。 对于 Kohn 雪花它的长度亦如此,而它的所包围的面积却是一个有限值,可以看出Kohn 雪花 的边界始终不会超过它生成等边三角形的外接圆,且可以证明出它的各个小菱角彼此不会相 交。由于 Kohn 曲线(雪花)生成的规则是一个递归的过程,它们具有严格的自相似结构,它们 就是分形,所以可以用相似维数对它们的维数进行计算。如果对Kohn 曲线进行比例为 4的放 缩可,可以看出它有三个与整体相似的局部,从而维数为log4/log3=1.2619,Kohn 雪花亦然。 下面我们分别来构造生成Kohn 曲线和Kohn 雪花的算法:(假设迭代次数为N) ① Kohn 曲线 ⑴ 选定一个初始点,并确定一条直线段的长度为 L;n=1; ⑵ 从初始点出发,水平延长L/3 长度; ⑶ 逆时针旋转60 度角,并延长 L/3的长度; ⑷ 顺时针旋转120 度,并延长L/3 的长度; ⑸ 逆时针旋转60 度,并延长L/3 的长度;n=n+1; ⑹ 如果 n>N 退出,否则计L=L/3,执行(2)~(6) 程序如下:如果选定初始点(100,250),并取长度为400 得到图形如2.5 Kohn(double length,int n) {/*构造 Kohn曲线的程序*/ if(n>=times)
Kohndlength/ n+l) circumrotate(60) circumrotate(60). ohn(ength/3. n+l) 图2.5Kohn的前1,2,5步迭代图形 ②Kohn雪花 构造Kohn雪花完全和Kohn曲线样,只是Komn雪花由三条等长的边变成,因此我们利 用上面Kohn曲线的生成函数,来分别对三条边生成 Kohn曲线,这样就形成了Kohn雪花 其程序生成图形(1,2,5):取初始点(150,350),边长300,并填充蓝色。 void Ko/ snowflake(double sidelength, int ny) 构造Kom雪花 circuanrotatef-120 odfillCu7entx+5. Cuerent-2, 1); 图2.6Kohn雪花的前1、2和5步造 随机Kohn曲线 Kohn曲线也可以进行随机生成,在构造的每一步去掉中间的1/3区段,然后用掷硬币的 办法来决定确定代替的两条边的突出方向。如果我们产生O,1随机数数均匀的话,也就是说 突出的两边往上与往下突的概率都为1/2。其余部分的构造和Kohn曲线完全一样。虽然随机 Kohn曲线不是完全规则的自相似结构,但是从统计意义上来讲,它具有统计自相似性,图形 如下图2.7。其实如果我们的随机性越好,所得的图形就越不规则,从而越接近大自然,针 对不同的随机效果,得到的图形也是千变万化的。既然它是分形,但不具有自相似结构,所
18 图 2.5 Kohn 的前 1,2,5步迭代图形 图 2.6 Kohn 雪花的前1、2和5步构造 prolong(length); else { Kohn(length/4,n+1); circumrotate(60); Kohn(length/3,n+1); circumrotate(-120); Kohn(length/3,n+1); circumrotate(60); Kohn(length/3,n+1); } } ② Kohn 雪花 构造 Kohn 雪花完全和 Kohn 曲线一样,只是 Kohn 雪花由三条等长的边变成,因此我们利 用上面 Kohn 曲线的生成函数,来分别对三条边生成Kohn 曲线,这样就形成了Kohn 雪花。 其程序生成图形(1,2,5):取初始点(150,350),边长300,并填充蓝色。 void KohnSnowflake(double sidelength,int n) {/*构造 Kohn雪花*/ Kohn(sidelength,n); circumrotate(-120); Kohn(sidelength,n); circumrotate(-120); Kohn(sidelength,n); floodfill(Currentx+5,Currenty-2,1); } 随机 Kohn 曲线 Kohn 曲线也可以进行随机生成,在构造的每一步去掉中间的1/3 区段,然后用掷硬币的 办法来决定确定代替的两条边的突出方向。如果我们产生0,1 随机数数均匀的话,也就是说 突出的两边往上与往下突的概率都为 1/2。其余部分的构造和 Kohn 曲线完全一样。虽然随机 Kohn 曲线不是完全规则的自相似结构,但是从统计意义上来讲,它具有统计自相似性,图形 如下图 2.7。其实如果我们的随机性越好,所得的图形就越不规则,从而越接近大自然,针 对不同的随机效果,得到的图形也是千变万化的。既然它是分形,但不具有自相似结构,所
以不好用相似维数来计算维数。 其构造方法和Kohn曲线一样,只要在旋转之前加入产生0-1随机数的判断,之后再进行 旋转即可,这里只要在Kohn生成程序的基础上修改else的内容,具体修改和图形如图2.7, 其中函数名仍然取为Koh else(生成Komn线的程字中的ee) Kohn(ength3n+1); Kohn(length3 n+l) circumvent(120) Kohn( t/, /m+1: 图2.7随即Khn曲线前3、5和9步构造 同样随机Kohn雪花与前面的构造完全一样,只要将 Kohnflake中调用的Kohn函数的内 容改为上面生成随机Koh曲线的函数程序即可,从而得到图象图2.8。如果以前面的保持随 机Kohn生成函数名不变,那么后面生成随机Kohn雪花的函数完全不变,并且迭代次数不同, 由于随机性我们生成的图形也将完全不同 图2.8Kohn雪花的前3、5和9步构造 对比随机产生的Kohn曲线与Kohn雪花和前面的Kohn曲线,可以看出为什么 Mandelbrot
19 图 2.7 随即 Kohn 曲线前3、5 和9步构造 图 2.8 Kohn 雪花的前3、5和9 步构造 以不好用相似维数来计算维数。 其构造方法和 Kohn 曲线一样,只要在旋转之前加入产生 0-1 随机数的判断,之后再进行 旋转即可,这里只要在 Kohn 生成程序的基础上修改 else 的内容,具体修改和图形如图 2.7, 其中函数名仍然取为 Kohn。 else(生成 Kohn曲线的程序中的 else) { Kohn(length/3,n+1); randflag=randRule(2); if(randflag) { circumrotate(60); Kohn(length/3,n+1); circumrotate(-120); Kohn(length/3,n+1); circumrotate(60); } else { circumrotate(-60); Kohn(length/3,n+1); circumrotate(120); Kohn(length/3,n+1); circumrotate(-60); } Kohn(length/3,n+1); } 同样随机 Kohn 雪花与前面的构造完全一样,只要将 Kohnflake 中调用的 Kohn 函数的内 容改为上面生成随机 Kohn 曲线的函数程序即可,从而得到图象图 2.8。如果以前面的保持随 机 Kohn 生成函数名不变,那么后面生成随机 Kohn 雪花的函数完全不变,并且迭代次数不同, 由于随机性我们生成的图形也将完全不同。 对比随机产生的Kohn曲线与Kohn雪花和前面的Kohn曲线,可以看出为什么Mandelbrot
用随机的Koh曲线和随机Kohn雪花作为海岸线和岛屿的模型的改进,正因为这科随机性, 才是迭代分形更加接近于自然 232递分形中的生虎元 由上面Kohn曲线的构造我们发现到,无论是确定的,还是随机的,它们都是由很简单的 几何图形通过一些简单的图形变化操作,不断地进行缩小比例的复制,最终形成自相似或者 统计自相似的复杂图案来。例如 Cantor集由直线出发去掉一些区段生成,Kohn曲线由对中 间区段用其他基本几何体代替生成,Koh雪花则是基本的等边三角形生成等等。所有的这些 好像是它们都能从最简单的元素出发进行简单操作得到复杂的结构。我们称这种简单元素为 生成元。我们甚至可以形象地比喻它为基因,因为它像基因一样把所有的外表形态记录在 个简单的生成元中,通过无限的复制从而形成形形色色的个体,犹如生命一般。 生成元在分形当中之所以这么重要,不仅是因为它能生成曾经认为是数学怪物的经典分 形,而且同时它能够表示一些植物或者动物的外表特征,从而表现出与大自然相似的图案, 这一点很切实际。我们可以试想一下,如果生成Kohn曲线的突出部分,不是等边三角形的两 边,而是等腰或者更一般的三角形,或者用其他的图形代替,这样图形将会表现为什么样的 情形呢?同样,如果我们不用直线段来生成,而是开始有一定的角度,然后旋转的角度也变 化,这样的图形又是什么样子呢?或者我们的在生成过程中,每段的长度如果是变化的,而 不是固定的缩小比例关系变化的,那么这样又会产生什么样的分形图呢?等等。其实这样的 变化可以说举不胜数,从而产生的分形也是形状各异,但总的来说,可以用生成元一个词来 概括这些情况,我们用一个容器装下这样不是直线的基本图形,然后进行无限复制产生图形, 从而就是这节所要讲述的生成元递归生成。 等长生成元 我们还是讨论固定步长的情况。仔细观察Kohn曲线的例子可以看出,其实它是由一系列 的旋转就完全确定了它的构造。例如:三次Kohn曲线,它的生成元缩小比例是3,旋转的角 度变化顺序为0,60,-120,60(其中逆时针为正,顺时针为负)。在其中开始和结尾是水平的, 所以都为0度。如果保持每段小线段的长度一致不变,那么这个生成元可以完全由有序的旋 转角度序列确定,三次Khn曲线生成元就可表示为为 element=(0,60,-120,60)。但正是由 于三次Kohn曲线的特殊性,它才有固定的放缩比例,对于一般的生成元,给定一个长度大小, 必须先从几何角度确定这个比例。然后我们所画的生成元,总可以使生成元的起始点和终止 点处于同水平线上,通过旋转角度使它水平,最后只要作反旋转就可以还原到前面的状态, 这里操作使图形处于水平状态 ()当角度序列 element两个端点不在同水平线上时,确定旋转角度使之水平 A 图2.9等长生成元
20 用随机的 Kohn 曲线和随机 Kohn 雪花作为海岸线和岛屿的模型的改进,正因为这种随机性, 才是迭代分形更加接近于自然。 2.3.2 递归分形中的生成元 由上面 Kohn 曲线的构造我们发现到,无论是确定的,还是随机的,它们都是由很简单的 几何图形通过一些简单的图形变化操作,不断地进行缩小比例的复制,最终形成自相似或者 统计自相似的复杂图案来。例如 Cantor 集由直线出发去掉一些区段生成,Kohn 曲线由对中 间区段用其他基本几何体代替生成,Kohn 雪花则是基本的等边三角形生成等等。所有的这些 好像是它们都能从最简单的元素出发进行简单操作得到复杂的结构。我们称这种简单元素为 生成元。我们甚至可以形象地比喻它为基因,因为它像基因一样把所有的外表形态记录在一 个简单的生成元中,通过无限的复制从而形成形形色色的个体,犹如生命一般。 生成元在分形当中之所以这么重要,不仅是因为它能生成曾经认为是数学怪物的经典分 形,而且同时它能够表示一些植物或者动物的外表特征,从而表现出与大自然相似的图案, 这一点很切实际。我们可以试想一下,如果生成 Kohn 曲线的突出部分,不是等边三角形的两 边,而是等腰或者更一般的三角形,或者用其他的图形代替,这样图形将会表现为什么样的 情形呢?同样,如果我们不用直线段来生成,而是开始有一定的角度,然后旋转的角度也变 化,这样的图形又是什么样子呢?或者我们的在生成过程中,每段的长度如果是变化的,而 不是固定的缩小比例关系变化的,那么这样又会产生什么样的分形图呢?等等。其实这样的 变化可以说举不胜数,从而产生的分形也是形状各异,但总的来说,可以用生成元一个词来 概括这些情况,我们用一个容器装下这样不是直线的基本图形,然后进行无限复制产生图形, 从而就是这节所要讲述的生成元递归生成。 ⚫ 等长生成元 我们还是讨论固定步长的情况。仔细观察 Kohn 曲线的例子可以看出,其实它是由一系列 的旋转就完全确定了它的构造。例如:三次 Kohn 曲线,它的生成元缩小比例是 3,旋转的角 度变化顺序为 0,60,-120,60 (其中逆时针为正,顺时针为负)。在其中开始和结尾是水平的, 所以都为 0 度。如果保持每段小线段的长度一致不变,那么这个生成元可以完全由有序的旋 转角度序列确定,三次 Kohn 曲线生成元就可表示为为 element=(0,60,-120,60)。但正是由 于三次 Kohn 曲线的特殊性,它才有固定的放缩比例,对于一般的生成元,给定一个长度大小, 必须先从几何角度确定这个比例。然后我们所画的生成元,总可以使生成元的起始点和终止 点处于同一水平线上,通过旋转角度使它水平,最后只要作反旋转就可以还原到前面的状态, 这里操作使图形处于水平状态。 ㈠ 当角度序列element 两个端点不在同一水平线上时,确定旋转角度使之水平: C E D B A 3 2 1 图 2.9 等长生成元