分形算法与程序设计
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
参考书:《分形算法与程序设计》 5
1.4 分形维数
分形维数是分形的很好的不变量,它一般是分数,用它可以 把握住分形体的基本特征。
图a是边长为1的正方形,当边长 变成原来的1∕2时,原正方形中包 含4个小正方形,如图b,而4=22; 图c是边长为1的正立方体,当边 长变成原来的1∕2时,原正立方体 中包含8个小正立方体,如图d,而 8=23。
变量:ax,ay(线段端点坐标) bx,by(线段端点坐标) cx,xy (线段端点坐标) dx,dy(线段端点坐标) ex,ey (线段端点坐标) L (线段长度) alpha (基线与水平线正 方向夹角)
14
参考书:《分形算法与程序设计》
2.2 Koch曲线的递归算法
BEGIN IF((bx-ax)*(bx-ax)+(by-ay)*(by-ay))<c THEN BEGIN plot(ax,ay)-(bx,by) END ELSE BEGIN cx=ax+(bx-ax)/3 cy=ay+(by-ay)/3 ex=bx-(bx-ax)/3 ey=by-(by-ay)/3 L=sqrt((ex-cx)*(ex-cx)+(ey-cy)*(ey-cy)) alpha=ArcTan((ey-cy)/(ex-cx)) IF ( (ex-cx)<0) THEN
参考书:《分形算法与程序设计》
19
2.4 Hilbert-Peano曲线的算法
BEGIN a(n) BEGIN IF n>0 THEN BEGIN d(n-1) x=x-len lineto (x,y) a(n-1) y=y+len lineto (x,y) a(n-1) x=x+len lineto (x,y) b(n-1) END END b(n) c(n) BEGIN BEGIN IF n>0 THEN IF n>0 THEN BEGIN BEGIN c(n-1) b(n-1) y=y-len x=x-len lineto (x,y) lineto (x,y) b(n-1) c(n-1) x=x+len y=y+len lineto (x,y) lineto (x,y) b(n-1) c(n-1) y=y+len x=x+len lineto (x,y) lineto (x,y) a(n-1) d(n-1) END END END 参考书:《分形算法与程序设计》 END d(n) BEGIN IF n>0 THEN BEGIN a(n-1) y=y-len lineto (x,y) d(n-1) x=x+len lineto (x,y) d(n-1) y=y+len lineto (x,y) c(n-1) END END 20 END
第
2章
分形图的递归算法
2.1 Cantor三分集的递归算法 2.2 Koch曲线的递归算法
2.4 Hilbert-Peano曲线的算法
2.5 分支结构分形递归算法
2.6 分形树递归算法
2.3 Sierpinski垫片的递归算法
参考书:《分形算法与程序设计》
10
递归算法
u 直接递归调用的例子如下:
2.4 Hilbert-Peano曲线的算法
算法:Peano(n) 标题: Hilbert-Peano曲线递归算法 变量:n (递归深度) len(线的长度) x,y(端点坐标) 函数:lineto(x,y) (画直线函数) 过程:a(n)(基本元素构型) b(n)(基本元素构型) c(n)(基本元素构型) d(n)(基本元素构型)
则有N=kD , D=log(N)/log(k) 这样Koch曲线的分形维数D=log(4)log(3)=1.2618
参考书:《分形算法与程序设计》 6
1.4 ቤተ መጻሕፍቲ ባይዱ形维数
对于实际的自然景物,我们可以用计盒维数的方法测量分维。
参考书:《分形算法与程序设计》
7
1.5 分形是一种方法论
沃尔夫奖(Wolf Prize)在颁发给分形理论创始人曼德勃罗时的评 语所说的,“分形几何改变了我们对世界的看法”。
函数: plot(x1,y1) –(x2,y2) (画直线函数) sin( ) (正弦函数) cos( ) (余弦函数) sqrt( ) (开平方函数)
参考书:《分形算法与程序设计》
17
2.3 Sierpinski垫片的递归算法
BEGIN IF (n=1) THEN BEGIN x1=x-L/2 x01=x-L/4 y1=y+L*(sin(PI/6)/cos(PI/6))/2 y01=y+L*(sin(PI/6)/cos(PI/6))/4 x2=x+L/2 x02=x-L/4 y2=y+L*(sin(PI/6)/cos(PI/6))/2 y02=y+L*(sin(PI/6)/cos(PI/6))/4 x3=x x03=x y3=y-L*(sin(PI/6)/cos(PI/6)) y03=y- L*(sin(PI/6)/cos(PI/6))/2 plot(x1,y1)-(x1,y1) Sierpinski(x01,y01,L/2,n-1) plot(x2,y2)-(x2,y2) Sierpinski(x02,y02,L/2,n-1) plot(x3,y3)-(x3,y3) Sierpinski(x03,y03,L/2,n-1) END END ELSE 18 参考书:《分形算法与程序设计》 END BEGIN
分形理论至少会在三个方面改变我们对世界的认识。首先,自然界
中许多不规则的形态其背后都有规则,都可以用分形的方法建立模型并 在计算机上构造出以假乱真的景象来,显然利用这套方法我们可以把世
界压缩到几个分形规则中,便于携带和传播。其次,许多以前被认为是
随机的现象,从分形理论的角度看并不是随机的,比如布朗运动、股票 价格的波动、传染病的流行传播等,这为我们控制这些貌似随机的现象 奠定了理论基础。最后,分形理论中的分数维概念,为我们认识世界中 的复杂形态提供了一个新的尺度。复杂性科学是现代科学的前沿,在这 门科学的研究过程中,发现了许多符合分形规则的复杂形态,而分数维 是测量这些形态复杂程度的一种度量。也就是说,我们找到了对复杂性
参考书:《分形算法与程序设计》 15
2.2 Koch曲线的递归算法
BEGIN alpha=alpha+PI END dy=cy+sin(alpha+PI/3)*L dx=cx+cos(alpha+PI/3)*L Koch(ax,ay,cx,cy,c) Koch(ex,ey,bx,by,c) Koch(cx,cy,dx,dy,c) Koch(dx,dy,ex,ey,c) END END
做定量分析的工具。
参考书:《分形算法与程序设计》 8
1.6 分形与计算机图形学
分形理论的发展离不开计算机图形学的支持,如果一个分形构 造的表达,不用计算机的帮助是很难让人理解的。不仅如此,分形 算法与现有计算机图形学的其他算法相结合,还会产生出非常美丽 的图形,而且可以构造出复杂纹理和复杂形状,从而产生非常逼真 的物质形态和视觉效果。
分形作为一种方法,在图形学领域主要是利用迭代、递归等技
术来实现某一具体的分形构造。 分形几何学与计算机图形学相结合,将会产生一门新的学科— —分形图形学。它的主要任务是以分形几何学为数学基础,构造非规 则的几何图素,从而实现分形体的可视化,以及对自然景物的逼真 模拟。
参考书:《分形算法与程序设计》 9
2.5 分支结构分形递归算法
算法:Ramus (x,y,alpha,L,n) 标题:分支结构递归算法 参数: PI(π值) 变量:n (递归深度) L (线段长度) x,y (线段起点坐标) x1,y1 (线段终点坐标) alpha (主干生成角度) alpha_L(左支干生成角度) alpha_R(右支干生成角度) 函数:plot(x1,y1)-(x2,y2) (画直线函数) sin( ) (正弦函数) cos( ) (余弦函数) 参考书:《分形算法与程序设计》
间接递归调用的例子如下:
void Recur_A(n)
BEGIN IF ((bx-ax)<c) THEN BEGIN plot(ax,ay)-(bx,by) END ELSE BEGIN plot(ax,ay)-(bx,by) 算法:Cantor(ax,ay,bx,by) cx=ax+(bx-ax)/3 标题:Cantor三分集的递归算法 cy=ay+d 参数:c(终止递归的小量) dx=bx-(bx-ax)/3 d(不同层次线之间的距离) dy=by+d 变量:ax,ay(曲线端点坐标) ay=ay+d bx,by(曲线端点坐标) by=by+d cx,xy (曲线端点坐标) cantor(ax,ay,cx,cy) dx,dy(曲线端点坐标) cantor(dx,dy,bx,by) 函数:plot(x1,y1) –(x2,y2) END 参考书:《分形算法与程序设计》 (画直线函数) END
第
1章
初识分形
1.1 Fractal 的含义 1.2 分形的几何特征
1.4 分形维数
1.5 分形是一种方法论
1.6 分形与计算机图形学
1.3 分形的度量
参考书:《分形算法与程序设计》
1
1.1 Fractal 的含义
英文单词Fractal,在大陆被译为“分形”,在台湾被译为
“碎形”。它是由美籍法国数学家曼德勃罗(Benoit Mandelbrot) 创造出来的。其含义是不规则的、破碎的、分数的。曼德勃罗是
精细结构
任意小局部总是包含细致的结构。
参考书:《分形算法与程序设计》 3
1.3 分形的度量
(1)长度的测量 Length(n=0)=1
Length(n=1)=4/3
Length(n=2)=16/9 ………… Length=lim(Length(n))
n→∞
=lim(4/3) = ∞ n→∞
n
参考书:《分形算法与程序设计》
2.1 Cantor三分集的递归算法
13
2.2 Koch曲线的递归算法
算法:Koch(ax,ay,bx,by,c)
标题:Koch曲线的递归算法
参数:c(终止递归的小量) PI(π值) 函数:plot(x1,y1) –(x2,y2) (画直线函数) sin( ) (正弦函数) cos( ) (余弦函数) ArcTan( ) (反正切函数) sqrt( ) (开平方函数)
想用此词来描述自然界中传统欧几里得几何学所不能描述的一大
类复杂无规的几何对象。
参考书:《分形算法与程序设计》
2
1.2 分形的几何特征
自相似性
自相似,便是局部与整体的相似。
自仿射性
自仿射性是自相似性的一种拓展。如果,将自相 似性看成是局部到整体在各个方向上的等比例变 换的结果的话,那么,自仿射性就是局部到整体 在不同方向上的不等比例变换的结果。前者称为 自相似变换,后者称为自仿射变换。
参考书:《分形算法与程序设计》
16
2.3 Sierpinski垫片的递归算法
算法:Sierpinski(x,y,L,n) 标题:Sierpinski垫片递归算法
参数:n (递归深度)
变量:x,y (三角形中心点坐标) x1,y1 (三角形顶点坐标) x2,y2 (三角形顶点坐标) x3,y3 (三角形顶点坐标) x01,y01 (小三角形中心点坐标) x02,y02 (小三角形中心点坐标) x03,y03 (小三角形中心点坐标) L (三角形的边长)
4
1.3 分形的度量
(2)面积的测量 Area(n0)=(1╳√3/6)/2= √3/12 Area(n1)=√3/12 ╳(4/9) Area(n2)=√3/12 ╳(4/9)2 ………… Area(n)=lim(√3/12 ╳(4/9)n)=0
n→∞
如上所述,koch曲线在一维欧氏空间中的度量为∞,在二维 欧氏空间中的面积为0。如此看来,Koch曲线在传统欧氏空间中 不可度量。
void Recur(n)
{
…… Recur(m);
……
} 过程Recur的内部又调用了自身——Recur过程。
参考书:《分形算法与程序设计》
11
递归算法
u { …… Recur_B(m); …… } void Recur_B(n) { …… Recur_A(m); …… }
参考书:《分形算法与程序设计》 12
1.4 分形维数
分形维数是分形的很好的不变量,它一般是分数,用它可以 把握住分形体的基本特征。
图a是边长为1的正方形,当边长 变成原来的1∕2时,原正方形中包 含4个小正方形,如图b,而4=22; 图c是边长为1的正立方体,当边 长变成原来的1∕2时,原正立方体 中包含8个小正立方体,如图d,而 8=23。
变量:ax,ay(线段端点坐标) bx,by(线段端点坐标) cx,xy (线段端点坐标) dx,dy(线段端点坐标) ex,ey (线段端点坐标) L (线段长度) alpha (基线与水平线正 方向夹角)
14
参考书:《分形算法与程序设计》
2.2 Koch曲线的递归算法
BEGIN IF((bx-ax)*(bx-ax)+(by-ay)*(by-ay))<c THEN BEGIN plot(ax,ay)-(bx,by) END ELSE BEGIN cx=ax+(bx-ax)/3 cy=ay+(by-ay)/3 ex=bx-(bx-ax)/3 ey=by-(by-ay)/3 L=sqrt((ex-cx)*(ex-cx)+(ey-cy)*(ey-cy)) alpha=ArcTan((ey-cy)/(ex-cx)) IF ( (ex-cx)<0) THEN
参考书:《分形算法与程序设计》
19
2.4 Hilbert-Peano曲线的算法
BEGIN a(n) BEGIN IF n>0 THEN BEGIN d(n-1) x=x-len lineto (x,y) a(n-1) y=y+len lineto (x,y) a(n-1) x=x+len lineto (x,y) b(n-1) END END b(n) c(n) BEGIN BEGIN IF n>0 THEN IF n>0 THEN BEGIN BEGIN c(n-1) b(n-1) y=y-len x=x-len lineto (x,y) lineto (x,y) b(n-1) c(n-1) x=x+len y=y+len lineto (x,y) lineto (x,y) b(n-1) c(n-1) y=y+len x=x+len lineto (x,y) lineto (x,y) a(n-1) d(n-1) END END END 参考书:《分形算法与程序设计》 END d(n) BEGIN IF n>0 THEN BEGIN a(n-1) y=y-len lineto (x,y) d(n-1) x=x+len lineto (x,y) d(n-1) y=y+len lineto (x,y) c(n-1) END END 20 END
第
2章
分形图的递归算法
2.1 Cantor三分集的递归算法 2.2 Koch曲线的递归算法
2.4 Hilbert-Peano曲线的算法
2.5 分支结构分形递归算法
2.6 分形树递归算法
2.3 Sierpinski垫片的递归算法
参考书:《分形算法与程序设计》
10
递归算法
u 直接递归调用的例子如下:
2.4 Hilbert-Peano曲线的算法
算法:Peano(n) 标题: Hilbert-Peano曲线递归算法 变量:n (递归深度) len(线的长度) x,y(端点坐标) 函数:lineto(x,y) (画直线函数) 过程:a(n)(基本元素构型) b(n)(基本元素构型) c(n)(基本元素构型) d(n)(基本元素构型)
则有N=kD , D=log(N)/log(k) 这样Koch曲线的分形维数D=log(4)log(3)=1.2618
参考书:《分形算法与程序设计》 6
1.4 ቤተ መጻሕፍቲ ባይዱ形维数
对于实际的自然景物,我们可以用计盒维数的方法测量分维。
参考书:《分形算法与程序设计》
7
1.5 分形是一种方法论
沃尔夫奖(Wolf Prize)在颁发给分形理论创始人曼德勃罗时的评 语所说的,“分形几何改变了我们对世界的看法”。
函数: plot(x1,y1) –(x2,y2) (画直线函数) sin( ) (正弦函数) cos( ) (余弦函数) sqrt( ) (开平方函数)
参考书:《分形算法与程序设计》
17
2.3 Sierpinski垫片的递归算法
BEGIN IF (n=1) THEN BEGIN x1=x-L/2 x01=x-L/4 y1=y+L*(sin(PI/6)/cos(PI/6))/2 y01=y+L*(sin(PI/6)/cos(PI/6))/4 x2=x+L/2 x02=x-L/4 y2=y+L*(sin(PI/6)/cos(PI/6))/2 y02=y+L*(sin(PI/6)/cos(PI/6))/4 x3=x x03=x y3=y-L*(sin(PI/6)/cos(PI/6)) y03=y- L*(sin(PI/6)/cos(PI/6))/2 plot(x1,y1)-(x1,y1) Sierpinski(x01,y01,L/2,n-1) plot(x2,y2)-(x2,y2) Sierpinski(x02,y02,L/2,n-1) plot(x3,y3)-(x3,y3) Sierpinski(x03,y03,L/2,n-1) END END ELSE 18 参考书:《分形算法与程序设计》 END BEGIN
分形理论至少会在三个方面改变我们对世界的认识。首先,自然界
中许多不规则的形态其背后都有规则,都可以用分形的方法建立模型并 在计算机上构造出以假乱真的景象来,显然利用这套方法我们可以把世
界压缩到几个分形规则中,便于携带和传播。其次,许多以前被认为是
随机的现象,从分形理论的角度看并不是随机的,比如布朗运动、股票 价格的波动、传染病的流行传播等,这为我们控制这些貌似随机的现象 奠定了理论基础。最后,分形理论中的分数维概念,为我们认识世界中 的复杂形态提供了一个新的尺度。复杂性科学是现代科学的前沿,在这 门科学的研究过程中,发现了许多符合分形规则的复杂形态,而分数维 是测量这些形态复杂程度的一种度量。也就是说,我们找到了对复杂性
参考书:《分形算法与程序设计》 15
2.2 Koch曲线的递归算法
BEGIN alpha=alpha+PI END dy=cy+sin(alpha+PI/3)*L dx=cx+cos(alpha+PI/3)*L Koch(ax,ay,cx,cy,c) Koch(ex,ey,bx,by,c) Koch(cx,cy,dx,dy,c) Koch(dx,dy,ex,ey,c) END END
做定量分析的工具。
参考书:《分形算法与程序设计》 8
1.6 分形与计算机图形学
分形理论的发展离不开计算机图形学的支持,如果一个分形构 造的表达,不用计算机的帮助是很难让人理解的。不仅如此,分形 算法与现有计算机图形学的其他算法相结合,还会产生出非常美丽 的图形,而且可以构造出复杂纹理和复杂形状,从而产生非常逼真 的物质形态和视觉效果。
分形作为一种方法,在图形学领域主要是利用迭代、递归等技
术来实现某一具体的分形构造。 分形几何学与计算机图形学相结合,将会产生一门新的学科— —分形图形学。它的主要任务是以分形几何学为数学基础,构造非规 则的几何图素,从而实现分形体的可视化,以及对自然景物的逼真 模拟。
参考书:《分形算法与程序设计》 9
2.5 分支结构分形递归算法
算法:Ramus (x,y,alpha,L,n) 标题:分支结构递归算法 参数: PI(π值) 变量:n (递归深度) L (线段长度) x,y (线段起点坐标) x1,y1 (线段终点坐标) alpha (主干生成角度) alpha_L(左支干生成角度) alpha_R(右支干生成角度) 函数:plot(x1,y1)-(x2,y2) (画直线函数) sin( ) (正弦函数) cos( ) (余弦函数) 参考书:《分形算法与程序设计》
间接递归调用的例子如下:
void Recur_A(n)
BEGIN IF ((bx-ax)<c) THEN BEGIN plot(ax,ay)-(bx,by) END ELSE BEGIN plot(ax,ay)-(bx,by) 算法:Cantor(ax,ay,bx,by) cx=ax+(bx-ax)/3 标题:Cantor三分集的递归算法 cy=ay+d 参数:c(终止递归的小量) dx=bx-(bx-ax)/3 d(不同层次线之间的距离) dy=by+d 变量:ax,ay(曲线端点坐标) ay=ay+d bx,by(曲线端点坐标) by=by+d cx,xy (曲线端点坐标) cantor(ax,ay,cx,cy) dx,dy(曲线端点坐标) cantor(dx,dy,bx,by) 函数:plot(x1,y1) –(x2,y2) END 参考书:《分形算法与程序设计》 (画直线函数) END
第
1章
初识分形
1.1 Fractal 的含义 1.2 分形的几何特征
1.4 分形维数
1.5 分形是一种方法论
1.6 分形与计算机图形学
1.3 分形的度量
参考书:《分形算法与程序设计》
1
1.1 Fractal 的含义
英文单词Fractal,在大陆被译为“分形”,在台湾被译为
“碎形”。它是由美籍法国数学家曼德勃罗(Benoit Mandelbrot) 创造出来的。其含义是不规则的、破碎的、分数的。曼德勃罗是
精细结构
任意小局部总是包含细致的结构。
参考书:《分形算法与程序设计》 3
1.3 分形的度量
(1)长度的测量 Length(n=0)=1
Length(n=1)=4/3
Length(n=2)=16/9 ………… Length=lim(Length(n))
n→∞
=lim(4/3) = ∞ n→∞
n
参考书:《分形算法与程序设计》
2.1 Cantor三分集的递归算法
13
2.2 Koch曲线的递归算法
算法:Koch(ax,ay,bx,by,c)
标题:Koch曲线的递归算法
参数:c(终止递归的小量) PI(π值) 函数:plot(x1,y1) –(x2,y2) (画直线函数) sin( ) (正弦函数) cos( ) (余弦函数) ArcTan( ) (反正切函数) sqrt( ) (开平方函数)
想用此词来描述自然界中传统欧几里得几何学所不能描述的一大
类复杂无规的几何对象。
参考书:《分形算法与程序设计》
2
1.2 分形的几何特征
自相似性
自相似,便是局部与整体的相似。
自仿射性
自仿射性是自相似性的一种拓展。如果,将自相 似性看成是局部到整体在各个方向上的等比例变 换的结果的话,那么,自仿射性就是局部到整体 在不同方向上的不等比例变换的结果。前者称为 自相似变换,后者称为自仿射变换。
参考书:《分形算法与程序设计》
16
2.3 Sierpinski垫片的递归算法
算法:Sierpinski(x,y,L,n) 标题:Sierpinski垫片递归算法
参数:n (递归深度)
变量:x,y (三角形中心点坐标) x1,y1 (三角形顶点坐标) x2,y2 (三角形顶点坐标) x3,y3 (三角形顶点坐标) x01,y01 (小三角形中心点坐标) x02,y02 (小三角形中心点坐标) x03,y03 (小三角形中心点坐标) L (三角形的边长)
4
1.3 分形的度量
(2)面积的测量 Area(n0)=(1╳√3/6)/2= √3/12 Area(n1)=√3/12 ╳(4/9) Area(n2)=√3/12 ╳(4/9)2 ………… Area(n)=lim(√3/12 ╳(4/9)n)=0
n→∞
如上所述,koch曲线在一维欧氏空间中的度量为∞,在二维 欧氏空间中的面积为0。如此看来,Koch曲线在传统欧氏空间中 不可度量。
void Recur(n)
{
…… Recur(m);
……
} 过程Recur的内部又调用了自身——Recur过程。
参考书:《分形算法与程序设计》
11
递归算法
u { …… Recur_B(m); …… } void Recur_B(n) { …… Recur_A(m); …… }
参考书:《分形算法与程序设计》 12