4.9 分形(二)

迭代函数系统(IFS)

迭代函数系统在分形几何中占有十分重要的地位,IFS分形实际上就是点在一组压缩仿射变换之下的像经反复迭代而产生的。

我们先从数轴上点的变换开始,研究函数的f(x)的迭代,定义:jhtbhelp。例如一次函数f(x)=0.5x+1,它是R->R的映射。初值x=-6时,f(-6)=-2,f(-2)=0,f(0)=1,.......,迭代多次,看下图,值越来越接近2。拖动滑块,改变x的值,你会发现,迭代值总是越来越接近2,与初始值无关。

jhtbhelp

从数列角度看这个问题,jhtbhelp,2就是这个函数的不动点,它可以由f(x)=x求得。

但是,若f(x)=2x+1,它用不动点-1之外的值迭代都不会收敛,因为x的系数大于1。

现在我们来看平面内点的仿射变换,它有不动点吗?比如变换W:jhtbhelp,令x'=x,y'=y 可以解出不动点(50/13,35/13)。

任取一点P0,用此仿射变换W得点P1,即P1=W(P0),若进行迭代,把P0映射到P1,可得下图。

jhtbhelp

拖动P0,迭代的终点会无限接近一个定点,它就是变换的不动点。由于P0是任意的,所以一个图形(点集)经此函数迭代后也会收缩到一个定点,此变换的系数行列式值为0.62,小于1,所以此变换是压缩的。

将变换改为:x'=0.6*x-0.8*y+3,y'=0.8*x+0.6*y-2,此变换是一个旋转变换和一个平移变换合成的,系数行列式值为1,图形变换后是与原来是全等的,点P0的迭代象集是一个圆,圆心就是不动点。若仿射变换系数行列式的绝对值大于1,点列会发散。

jhtbhelp

仅仅有一个仿射变换是不能画出漂亮的图形的。设有n个压缩仿射变换W1、W2,.......,Wn,它们构成一个迭代函数系统IFS,记作W={W1,W2,.......,Wn},对给定的点集E0,若W迭代变换后有极限点集S,则称S为IFS的吸引子。只要变换设置恰当,图形会非常美观。下面通过一个例子说明画图过程。

例4.9.1:IFS-莱维(Levy)曲线

保罗·皮埃尔·莱维在1938年提出莱维曲线,也称C曲线(转90度看),它是将一条线段(单位长)不停地分成两条长度相等且相互垂直的线段而生成的。它与龙曲线的右生成元方向不同,但在勾股树中似曾相识,是一致的。

jhtbhelp

生成元有两条线段组成,应该有两个仿射变换。W1是把原线段AB先压缩sqrt(2)/2,再旋转45度到AC;W2是把原线段先压缩sqrt(2)/2,再旋转-45度到AD,最后平移(0.5,0.5)到CB,所以根据伸缩、旋转与平移公式,有

jhtbhelp

画法一:

1. 【二维】视图,页属性中改单位长120,添加自由点P,度量它的坐标x、y,计算(x-y)/2和(x+y)/2,选取后【点】工具添加坐标点P1,再同法计算(x+y+1)/2和(-x+y+1)/2,添加坐标点P2,它们分别是点P在W1、W2变换下的象。

jhtbhelp

2. 新建整数参数n,从0到12,添加深度为n的最终迭代,P分别映射到P1和P2。点P1、P2的属性中改用“被遮住时不显示”,点的大小为2,颜色改为粉红与绿。迭代属性中只要显示点P1、P2的象,不显示数据表,显示最终迭代,仅显示实线。拖动n=10左右,拖动点P,它对图形影响很小,类似数列的前几项不影响它的极限。隐藏三个点及计算式。

jhtbhelp

画法二:

画法一必须先知道仿射变换式,如果你对有关变换公式不理解,图霸的【变换-仿射变换】命令可以自动帮你计算,对话框中还可以查看到相关系数,画法二介绍这种方法。为了便于变形,生成元上做了些变化。

1. 【二维】视图,使用【自定义】工具画【等腰直角三角形】ABC,作斜边BC中点D,连结AD。新建整数参数n,从0到12,新建角数参数c,从30度到45度。新建参数k,从-sqrt(3)/3到sqrt(2)/2(也可以为-1到1)。将ΔABC绕点B旋转参数c到ΔA'BC',然后把ΔA'BC'以B为中心,k为比缩放到ΔA1BC1,再把ΔA1BC1关于AD对称到ΔA2CC2。变换时只变换两个顶点然后连线即可。旋转中心B不用变换,否则会重复,可以隐藏它。ΔABC与两侧对称的两个小三角形相似。

jhtbhelp

2. 依次选取点A、B、C,【变换-标志仿射变换规则】,再选择点A1、B、C1,【变换-标志仿射变换规则】。【点工具】添加自由点P,选取点P,【变换-仿射】,对话框中已经选择了“二维坐标系→二维三点”,点击选择“二维三点→二维三点”,它下面的变换公式就是根据刚才标志的仿射规则得到的。“确定”后得到点P变换后的点,改名P1。同样标志从ΔABC到ΔA2C2C的仿射变换规则,并把点P变换到点P2。

jhtbhelp

3.类似画法一的第2步添加迭代。拖动三个参数滑块到最右侧,得到莱维曲线,观看下图,理解c=45度及k=sqrt(2)/2的道理。

jhtbhelp

4. 拖动参数c与k到最左侧,c=30度,k=-sqrt(3),得到柯赫曲线。修改c及k的范围,改变转角c及相似比k,还可以得到其它漂亮的曲线,试试看。保存文件,比较法一与法二,在拖动n时哪一个图形显示的速度更快。

jhtbhelp

你理解IFS吗?试一试绘制龙曲线。

例4.9.2:绘制谢氏塔

我们来看三维谢氏塔(墓垛)的生成过程。取一个大的正四面体,通过4个中位面,分成4个完全相同的小正四面体和中间的一个正八面体,挖掉中间的一个八面体,这是第一步。 然后将剩下的4个小正四面体按照上述办法各自分出4个小正四面体和1个正八面体,去掉中间的一个八面体,这是第二步。 依次类推,不断划分出小的正四面体,同时去掉中间的一个小八面体。如下图所示。

jhtbhelp

1.进入【三维视图】,使用【常用-添加-坐标点】,点击“创建多个点”,选择常用点集中“正四面体顶点”,“确定”,添加四点A、B、C、D,两两连结,得一个固定大小的正四面体的线框。当然,你也可以使用动态的三棱锥,锁定拖移。

jhtbhelp

2. 按【Ctrl+L】键,选取六条棱,【点】工具添加中点。两两相连。中间是一个八面体,四角上各有一个小四面体线框。如下图,这里的所有点线,在制作完成后都可以删除。

jhtbhelp

3.依次选取点A、B、C、D,【变换-标志仿射变换规则】,再选择四点A、E、F、G,【变换-标志仿射变换规则】。【点】工具添加自由点,改名0。选取点0,【变换-仿射】,对话框中已经选择了“三维四点→三维四点”,点击选择“指定三维变换公式”,它下面的数据就是根据刚才标志的仿射规则得到的,不修改,“确定”后得到点变换后的点0',改名“1”. 使用指定公式,变换脱离原有标志的点,计算快。

jhtbhelp

4.再依次选取点A、B、C、D,【变换-标志仿射变换规则】,选择四点E、B、J、H,【变换-标志仿射变换规则】。选取点0,【变换-仿射】,点选“指定三维变换公式”,得到点变换后的点,改名“2”.

jhtbhelp

5.同样地,再把点A、B、C、D对应到点F、J、C、I(由于是正四面体,四点顺序可随意),点0【仿射变换】得到点3;再把点A、B、C、D对应到点G、H、I、D,点0【仿射变换】得到点4.

6.选取点0,点A,【编辑-操作按钮-移动】,添加“移动按钮”,点击执行,把点0移到与点A重合,也可以与原四面体的其它顶点或边的中点重合。按【Ctrl+A】键,全所所有对象,在对象列表中,点击0、1、2、3、4这五个点前面的点状图标,排除这些点的选择,按【Delete】键删除,仅留下五个点。

7.右击鼠标,“新建参数”,整数值,从0到8,当前值3,改名n。

8.对象列表中选取点0,【变换-迭代】,对话框中“映象”下选1,再“增加映射”,映象到2,重复操作,得四重映象。如下图,确定。

jhtbhelp

9.隐藏点0,选择“迭代图”及参数n,“对象列表”中,点【属性】工具,把n关连为迭代的深度,仿前例设置4个点及迭代的属性。

jhtbhelp

10.选取点1、2、3、4,【颜色-自动随机色】,【显示-点大小-输入值】1。解除锁定,拖动n(电脑性能不太好的,n不能太大,拖动前先保存),改变视角,放大观看,这是全部由点构成的图形。

jhtbhelp

显示点0,拖动它,看对图形有何影响。思考作图的原理。

例4.8.3:巴恩斯利蕨

美国佐治亚理工学院的巴恩斯利教授是第一个提出迭代函数系统的人,他实际上研究的是如何利用自相似性把描绘自然景观的信息进行大幅压缩。基本思路是以一些运算规则为基础,把原始图形(生成元)进行收缩、旋转、平移等收敛性的仿射变换,最终形成具有自相似的分形结构的极限图形, 该集就被称为IFS。

为了生成植物的形状,巴恩斯利教授把两种运算规则相结合:确定性算法与随机性算法。一方面他规定了一组N个确定的仿射变换(记为R1,R2,R3……RN) ,每次迭代的规则都必定来源于组内。另一方面,具体每次迭代哪一个规则是随机决定的。运算时,每个规则Ri被选取的可能性记为Pi。每次随机地从Ri(i=1,…,N)中挑选一个迭代规则迭代一次,然后再随机地在Ri(i=1,…,N)中选一个规则迭代一次,不断重复,最后生成一张类似植物形态的极限图形。

这样利用规则迭代而生成的分形图有很多,其中一种著名图形就叫巴恩斯利蕨(Barnsley fern)。

由于带概率,它就称为IFSP分形,图霸中可以直接用公式计算。二维仿射变换公式为:x'=ax+by+e,y'=cx+dy+f。

生成巴恩斯利蕨利用的四个仿射变换系数如下表:

W a b c d e f P(概率)
1 0 0 0 0.16 0 0 0.01
2 0.85 0.04 -0.04 0.85 0 1.6 0.85
3 0.2 -0.26 0.23 0.22 0 1.6 0.07
3 -0.15 0.28 0.26 0.24 0 0.44 0.07

这四个变换把下图中的红色矩形分别变换为W1(根枝)、W2(主体)、W3(左下叶)、W4(右下叶)四个矩形。

制作步骤:

1. 新建参数k,从0到10,选取k,计算k+1和int(rand(100)),把int(rand(100))改名为r,它可以等可能产生100个整数值。r值为0的概率为0.01,对应选择公式1,r值从1到85的概率为0.85,对应选择公式2,r值从86到92的概率为0.07,对应选择公式3,其它7种对应于公式4。新建参数t,选取它,计算set(0,0)+set(1,0),添加t的动画按钮“初值”,从0到0,快速。

2. 选取计算式r,计算:if(No1==0,set(0,0)+set(1,0.16*get(1)),No1<=85,set(2,0.85*get(0)+0.04*get(1))+set(1,-0.04*get(0)+0.85*get(1)+1.6)+set(0,get(2)),No1<=92,set(2,0.2*get(0)-0.26*get(1))+set(1,0.23*get(0)+0.22*get(1)+1.6)+set(0,get(2)),set(2,-0.15*get(0)+0.28*get(1))+set(1,0.26*get(0)+0.24*get(1)+0.44)+set(0,get(2))),改名为c,它根据随机数的值选择四个仿射变换之一计算点的新坐标x'、y',存入0号和1号变量中。选取c,计算get(0)和get(1)-5,改名称为x,y。

3. 选取x、y,添加坐标点A,属性中改“被遮住时不显示”。选取k,迭代,映射到k+1,属性中只创建点A的象,不显示数据表,深度1000。

4. 选取迭代图,追踪。选取k,添加动画按钮,0到1,慢速,名称“叠加”。添加【命令序列】-“擦除踪迹”按钮。它与“初值”按钮构成【系列】按钮,名称“重置”,同时执行。重置后点击“叠加”按钮,树上点不断增加。修改点颜色、大小后再重绘。隐藏参数及计算式、“初值”及“命令序列”按钮。

练习1:制作IFS维切克(Vicsek)图形。

jhtbhelp

练习2:以外接圆半径为12的正三角形的中心为原点建系,把ΔABC长度缩放到原来的1/2得ΔA'B'C',再分别向原三个顶点平移,得到ΔAFE、ΔFBD、ΔEDC。

jhtbhelp

可以得出这三个仿射变换的公式如下:

jhtbhelp

据此绘制IFS谢尔宾斯基三角形。

练习3:根据表格中的数据制作IFS分形树,调整各部分概率分次叠加着色。

W a b c d e f
1 0.4 -0.29 0.29 0.4 -2.35 -0.76
2 0.49 -0.08 0.08 0.49 -0.63 3.95
3 0.4 0.29 -0.29 0.4 2.35 3.23
4 0.48 0.24 -0.24 0.48 1.94 -2.59
5 -0.028 0 0 -0.71 0 -3.1

jhtbhelp

进入下一章

返回帮助目录