分形算法与程序设计.ppt
参考书:分形算法与程序设计,1,第 1 章,初识分形,1.1 Fractal 的含义1.2 分形的几何特征 1.3 分形的度量,1.4 分形维数1.5 分形是一种方法论 1.6 分形与计算机图形学,参考书:分形算法与程序设计,2,1.1,Fractal 的含义,英文单词Fractal,在大陆被译为“分形”,在台湾被译为“碎形”。它是由美籍法国数学家曼德勃罗(Benoit Mandelbrot)创造出来的。其含义是不规则的、破碎的、分数的。曼德勃罗是想用此词来描述自然界中传统欧几里得几何学所不能描述的一大类复杂无规的几何对象。,参考书:分形算法与程序设计,3,1.2,分形的几何特征,自相似性,自相似,便是局部与整体的相似。,自仿射性,自仿射性是自相似性的一种拓展。如果,将自相似性看成是局部到整体在各个方向上的等比例变换的结果的话,那么,自仿射性就是局部到整体在不同方向上的不等比例变换的结果。前者称为自相似变换,后者称为自仿射变换。,精细结构,任意小局部总是包含细致的结构。,参考书:分形算法与程序设计,4,1.3,分形的度量,(1)长度的测量 Length(n=0)=1 Length(n=1)=4/3 Length(n=2)=16/9 Length=lim(Length(n)=lim(4/3)=,n,n,n,参考书:分形算法与程序设计,5,1.3,分形的度量,(2)面积的测量 Area(n0)=(13/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曲线在传统欧氏空间中不可度量。,参考书:分形算法与程序设计,6,1.4,分形维数,分形维数是分形的很好的不变量,它一般是分数,用它可以把握住分形体的基本特征。,图a是边长为1的正方形,当边长变成原来的12时,原正方形中包含4个小正方形,如图b,而4=22;图c是边长为1的正立方体,当边长变成原来的12时,原正立方体中包含8个小正立方体,如图d,而8=23。,则有NkD,D=log(N)/log(k)这样Koch曲线的分形维数D=log(4)log(3)=1.2618,参考书:分形算法与程序设计,7,1.4,分形维数,对于实际的自然景物,我们可以用计盒维数的方法测量分维。,参考书:分形算法与程序设计,8,1.5,分形是一种方法论,沃尔夫奖(Wolf Prize)在颁发给分形理论创始人曼德勃罗时的评语所说的,“分形几何改变了我们对世界的看法”。分形理论至少会在三个方面改变我们对世界的认识。首先,自然界中许多不规则的形态其背后都有规则,都可以用分形的方法建立模型并在计算机上构造出以假乱真的景象来,显然利用这套方法我们可以把世界压缩到几个分形规则中,便于携带和传播。其次,许多以前被认为是随机的现象,从分形理论的角度看并不是随机的,比如布朗运动、股票价格的波动、传染病的流行传播等,这为我们控制这些貌似随机的现象奠定了理论基础。最后,分形理论中的分数维概念,为我们认识世界中的复杂形态提供了一个新的尺度。复杂性科学是现代科学的前沿,在这门科学的研究过程中,发现了许多符合分形规则的复杂形态,而分数维是测量这些形态复杂程度的一种度量。也就是说,我们找到了对复杂性做定量分析的工具。,参考书:分形算法与程序设计,9,1.6,分形与计算机图形学,分形理论的发展离不开计算机图形学的支持,如果一个分形构造的表达,不用计算机的帮助是很难让人理解的。不仅如此,分形算法与现有计算机图形学的其他算法相结合,还会产生出非常美丽的图形,而且可以构造出复杂纹理和复杂形状,从而产生非常逼真的物质形态和视觉效果。分形作为一种方法,在图形学领域主要是利用迭代、递归等技术来实现某一具体的分形构造。分形几何学与计算机图形学相结合,将会产生一门新的学科分形图形学。它的主要任务是以分形几何学为数学基础,构造非规则的几何图素,从而实现分形体的可视化,以及对自然景物的逼真模拟。,参考书:分形算法与程序设计,10,第 2 章,分形图的递归算法,2.1 Cantor三分集的递归算法2.2 Koch曲线的递归算法 2.3 Sierpinski垫片的递归算法,2.4 Hilbert-Peano曲线的算法2.5 分支结构分形递归算法2.6 分形树递归算法,参考书:分形算法与程序设计,11,递归算法,u 直接递归调用的例子如下:void Recur(n)Recur(m);过程Recur的内部又调用了自身Recur过程。,参考书:分形算法与程序设计,12,递归算法,u 间接递归调用的例子如下:void Recur_A(n)Recur_B(m);void Recur_B(n)Recur_A(m);,参考书:分形算法与程序设计,13,2.1,Cantor三分集的递归算法,参考书:分形算法与程序设计,14,2.2,Koch曲线的递归算法,参考书:分形算法与程序设计,15,2.2,Koch曲线的递归算法,参考书:分形算法与程序设计,16,2.2,Koch曲线的递归算法,参考书:分形算法与程序设计,17,2.3,Sierpinski垫片的递归算法,参考书:分形算法与程序设计,18,2.3,Sierpinski垫片的递归算法,参考书:分形算法与程序设计,19,2.4,Hilbert-Peano曲线的算法,参考书:分形算法与程序设计,20,2.4,Hilbert-Peano曲线的算法,参考书:分形算法与程序设计,21,2.5,分支结构分形递归算法,参考书:分形算法与程序设计,22,2.5,分支结构分形递归算法,参考书:分形算法与程序设计,23,2.6,分形树递归算法,参考书:分形算法与程序设计,24,2.6,分形树递归算法,参考书:分形算法与程序设计,25,第 3 章,文法构图算法,3.1 LS文法3.2 单一规则的LS文法生成,3.3 多规则的LS文法生成3.4 随机LS文法,参考书:分形算法与程序设计,26,文法构图算法,字母表:L,R生成规则:LR,RL R初始字母:R则有:RL RR L RL R R L RR L R L R R L RL R R L R R L R L R R L R,参考书:分形算法与程序设计,27,3.1,LS文法,二维LS是字母表的绘图规则如下:F:以当前方向前进一步,并画线;f:以当前方向前进一步,不画线;:逆时针旋转角;:顺时针旋转角;:将海龟当前信息压栈;:将“”时刻的海龟信息出栈。,参考书:分形算法与程序设计,28,3.2,单一规则的LS文法生成,Koch曲线的LS文法如下:w:F a:60o P:F F F F F,步骤0:F 步骤1:F F F F 步骤2:F F F F F F F F F F F F F F F F 步骤3: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 步骤4:,参考书:分形算法与程序设计,29,3.3,单一规则的LS算法实现,参考书:分形算法与程序设计,30,3.3,单一规则的LS算法实现,参考书:分形算法与程序设计,31,3.3,单一规则的LS算法实现,参考书:分形算法与程序设计,32,3.3,多规则的LS文法生成,为了生成更复杂的图形,可将字母表增加字母元素,Sierpinski垫片的LS文法如下:w:L a:600 P1:L R L R P2:R L R L 相应的改造1:,参考书:分形算法与程序设计,33,3.3,多规则的LS文法生成,相应的改造2:,参考书:分形算法与程序设计,34,3.3,多规则的LS文法生成,相应的改造3:,参考书:分形算法与程序设计,35,3.4,随机LS文法,w:Fa:25P1:FFFFFFP2:FFFFFFP3:FFFFFFFFF,为了更好的模拟自然景物,需要随机使用多个变换规则。,p1,p2,p3,相应的改造1:,相应的改造2:,参考书:分形算法与程序设计,36,3.4,随机LS文法,参考书:分形算法与程序设计,37,第 4 章,迭代函数系统算法,4.1 混沌游戏4.2 迭代函数系统4.3 相似变换与仿射变换4.4 IFS码,4.5 Sierpinski垫片的IFS生成4.6 拼贴与IFS码的确定 4.7 IFS植物形态实例4.8 复平面上的IFS算法,参考书:分形算法与程序设计,38,混沌游戏,4.1,给定平面上三点A,B,C。再任意给定初始点Z0,做下列迭代。,当掷出的硬币呈正面,当掷出的硬币呈反面,当掷出的硬币呈侧面,参考书:分形算法与程序设计,39,迭代函数系统,4.2,迭代函数系统(Iterated Function System,IFS)是分形理论的重要分支。它将待生成的图像看成是由许多与整体相似的(自相似)或经过一定变换与整体相似的(自仿射)小块拼贴而成。,参考书:分形算法与程序设计,40,相似变换与仿射变换,直观上看:相似变换是指在各个方向上变换的比率必须相同的一种比例变换,仿射变换是指在不同的方向上变化的比率可以不同的一种比例变换。,4.3,相似变换:如果对于任意两点A、B,以及对应点A、B,总有AB=kAB(k为正实数),那么,这个变换叫做相似变换,实数k叫做相似比。仿射变换:x=ax+by+e y=cx+dy+f其中a,b,c,d,e,f为仿射变换系数。,参考书:分形算法与程序设计,41,4.4,IFS码,用多个仿射变换式表达一个图象w1,w2,w3,,使用每一个仿射变换式的概率p可以不同,一般面积越大,p值越大。于是,只要获得a,b,c,d,e,f,p(IFS码)的值便可以得到要表达的图形。,参考书:分形算法与程序设计,42,4.5,Sierpinski垫片的IFS生成,由于生成的三个小三角形的面积相等,所以我们可以让w1、w2、w3出现的概率相同或相近。,x=0.5x y=0.5y,x=0.5x+0.5 y=0.5y,x=0.5x+0.25 y=0.5y-0.5,x=0.5x+0y+0 y=0 x+0.5y+0 x=0.5x+0y+0.5 y=0 x+0.5y+0 x=0.5x+0y+0.25 y=0 x+0.5y-0.5,w1,w2,w3,参考书:分形算法与程序设计,43,4.5,Sierpinski垫片的IFS生成,参考书:分形算法与程序设计,44,4.5,Sierpinski垫片的IFS生成,(源代码:书中程序4.1),参考书:分形算法与程序设计,45,4.6,拼贴与IFS码的确定,此时四个子图分别是目标图的1/4、1/5、1/4、1/2大小的复制品。然后按顺序交互式地在屏幕上调节每一个子图的仿射变换参数ai、bi、ci、di、ei,使得平移、旋转后基本覆盖住目标图。,参考书:分形算法与程序设计,46,4.7,IFS植物形态实例,IFS码在书中表4.18,IFS码在书中表4.20,IFS码在书中表4.19,参考书:分形算法与程序设计,47,4.8,复平面上的IFS算法,参考书:分形算法与程序设计,48,4.8,复平面上的IFS算法,参考书:分形算法与程序设计,49,4.8,复平面上的IFS算法,参考书:分形算法与程序设计,50,第 5 章,逃逸时间算法,5.1 基本思想5.2 Julia集的逃逸时间算法,5.3 Mandelbrot集的逃逸时间算法5.4 基于牛顿迭代的Julia集的逃逸时间算法,参考书:分形算法与程序设计,51,逃逸时间算法的基本思想,F(z)=z2+c当c=0时,由于z是复数,即z=x+yi,则有z2=zz=(x+yi)(x+yi)=x2+y2i2+2xyi=(x2-y2)+(2xy)i设复数z=x+yi的绝对值,即|z|=SQR(x2+y2)|F(z0)|=|x02-y02+2x0y0i|=SQR(x02-y02)2+(2x0y0)2)=SQR(x04+y04-2x02y02+4x02y02)=SQR(x02+y02)2)=|z0|2若01,经过迭代z会趋向无穷,z向无穷逃逸。若|z0|1,z是平面上的单位圆。,5.1,参考书:分形算法与程序设计,52,逃逸时间算法的基本思想,当c0时,其吸引子不再是0,而是一个区域,称混沌区。如图,假设有一个充分大的整数N,当未逃逸区域M中的初始点a经过小于N次迭代就达到未逃逸区域M的边界,甚至超出了边界,我们就认为点a逃逸出去了;而如果经过N次迭代后a的轨迹仍未到达M的边界,我们就认为,a是A上的点。用这样的方法,描绘出A的边界图形,这便是逃逸时间算法的基本思想。,5.1,参考书:分形算法与程序设计,53,5.2,Julia集的逃逸时间算法,参考书:分形算法与程序设计,54,5.2,Julia集的逃逸时间算法,参考书:分形算法与程序设计,55,5.2,Julia集的逃逸时间算法,参考书:分形算法与程序设计,56,参考书:分形算法与程序设计,57,5.3,Mandelbrot集的逃逸时间算法,参考书:分形算法与程序设计,58,5.3,Mandelbrot集的逃逸时间算法,参考书:分形算法与程序设计,59,参考书:分形算法与程序设计,60,5.4,基于牛顿迭代的Julia集的逃逸时间算法,牛顿迭代法求根公式:zn+1=zn-f(zn)/f(zn)其中,f(zn)是f(zn)的导数。考虑f(z)=z3-1=0的情况,那么相应的牛顿变换是f(z)=(2z3+1)/3z2则z的三个根分别是w1=1,w2=ei2/3,w3=ei4/3,三个根的吸引域A(w1),A(w2),A(w3)的交界便是牛顿函数的Julia集。经过迭代,在A(wi)上的点都会被吸引到点wi上。设一个较大的迭代次数N,以及一个距离小量r,当迭代次数达到N,其与根点的距离小于r的被认为是收敛到某根上了,否则被认为是逃逸了。,参考书:分形算法与程序设计,61,5.4,基于牛顿迭代的Julia集的逃逸时间算法,参考书:分形算法与程序设计,62,5.4,基于牛顿迭代的Julia集的逃逸时间算法,参考书:分形算法与程序设计,63,第 6 章,分形显微镜,6.1 逃逸时间算法的放缩原理6.2 Mandelbrot集的局部放大6.3 Julia集的局部放大,6.4 牛顿迭代法的局部放大6.5 作为Julia集字典的Mandelbrot集,参考书:分形算法与程序设计,64,逃逸时间算法的放缩原理,6.1,参考书:分形算法与程序设计,65,6.2,Mandelbrot集的局部放大,参考书:分形算法与程序设计,66,6.2,Mandelbrot集的局部放大,参考书:分形算法与程序设计,67,6.3,Julia集的局部放大,参考书:分形算法与程序设计,68,6.3,Julia集的局部放大,参考书:分形算法与程序设计,69,6.4,牛顿迭代法的局部放大,参考书:分形算法与程序设计,70,6.4,牛顿迭代法的局部放大,参考书:分形算法与程序设计,71,6.5,作为Julia集字典的Mandelbrot集,Julia集是一个固定的值的图形展现,而Mandelbrot集却要走遍所有的值,显然,每一个值都对应一个Julia集,所以我们说Mandelbrot集是Julia集微缩字典。,我们可以在Mandelbrot集的绘图空间中任意取一点,并将其还原成相应的值,再将此值作为Julia集程序中选定的值,来绘制Julia集的图形。,参考书:分形算法与程序设计,72,第 7 章,分形演化算法,7.1 从逻辑运算谈起 7.2 一维元胞自动机 7.3 二维元胞自动机,7.4 分形演化的DLA模型 7.5 用DLA模型模拟植物的生长7.6 不同初始条件的DLA形态,参考书:分形算法与程序设计,73,参考书:分形算法与程序设计,74,从逻辑运算谈起,7.1,逻辑异或 本 行:0 0 0 1 1 0 1 1下一行:0 1 1 0,参考书:分形算法与程序设计,75,7.2,一维元胞自动机,元胞按等间隔方式分布在一条向两侧无限延伸的直线中,称为一维元胞自动机。,本 行:001 100 其他下一行:1 1 0,参考书:分形算法与程序设计,76,7.2,一维元胞自动机,参考书:分形算法与程序设计,77,7.3,二维元胞自动机,在一个二维网格中,如果抛下一粒种子(元胞着色),然后考察一下种子身边的格子中的元胞状态会发生什么事情。给一个规则,即每一个格子的状态,由其周围的八个格子的状态(0或1)来决定,如果它周围八个格子中的状态值相加为奇数时,则此格子下一个状态为1;如果它周围八个格子中的状态值相加为偶数时,则此格子下一个状态为0。就这样一步一步演化下去,会看到图案。,参考书:分形算法与程序设计,78,7.3,二维元胞自动机,参考书:分形算法与程序设计,79,7.4,分形演化的DLA模型,自然界中有很多种这样的生长集团,参考书:分形算法与程序设计,80,7.4,分形演化的DLA模型,参考书:分形算法与程序设计,81,7.4,分形演化的DLA模型,参考书:分形算法与程序设计,82,7.5,用DLA模型模拟植物的生长,如果初始不是一个原点,而是一条直线,且随机粒子从上面落到平面上,它将会产生一个什么样的图形呢?,参考书:分形算法与程序设计,83,7.6,不同初始条件的DLA形态,参考书:分形算法与程序设计,84,第 8 章,分形动画,8.1 双缓存技术8.2 摇曳的递归分形树 8.3 旋转万花筒,8.4 变形的芦苇 8.5 收缩与伸展 8.6 连续变化的Julia集,参考书:分形算法与程序设计,85,在计算机上实现动画,一个关键技术就是:在绘制新图之前要删除旧图。当然可以在每次画新图之前清屏以实现删除旧图,但由于分形图一般画起来都比较慢,清屏之后不会及时画出新图,这样就会使动画产生闪烁。为了解决这一问题,可以在程序中使用了双缓存技术,即创建两个缓冲区,一个用来绘制图形,一个用来显示图形,当在显示图形缓冲区中删除旧图的同时,在绘制图形缓冲区中画新图,随后由显示图形缓冲区调出此图,从而提高了显示速度,避免了动画的闪烁。,8.1,双缓存技术,参考书:分形算法与程序设计,86,8.1,双缓存技术,参考书:分形算法与程序设计,87,摇曳的递归分形树,8.1,参考书:分形算法与程序设计,88,8.3,旋转万花筒,参考书:分形算法与程序设计,89,8.4,变形的芦苇,参考书:分形算法与程序设计,90,8.4,收缩与伸展,参考书:分形算法与程序设计,91,8.6,连续变化的Julia集,参考书:分形算法与程序设计,92,8.6,连续变化的Julia集,参考书:分形算法与程序设计,93,8.6,连续变化的Julia集,参考书:分形算法与程序设计,94,第 9 章,三维空间中的分形,9.1 OpenGL简介 9.2三维空间中的Sierpinski地毯,9.3 Sierpinski金字塔 9.4三维空间中Sierpinski海绵,参考书:分形算法与程序设计,95,OpenGL简介,9.1,OpenGL,即开放性图形库(Open Graphics Library),是一个三维的计算机图形和模型库。OpenGL包含120个图形函数,在微机环境下共有5种函数,即基本(或核心)函数、实用函数、辅助函数、Windows专用函数和Win32 API函数。,参考书:分形算法与程序设计,96,OpenGL的基本功能,1 绘制物体 OpenGL提供了丰富的基本图元绘制命令,从而可以方便地绘制物体,包括规则的和不规则的。,参考书:分形算法与程序设计,97,OpenGL的基本功能,2 变换 OpenGL提供了一系列基本的变换,如取景变换、模型变换、投影变换及视口变换。,参考书:分形算法与程序设计,98,OpenGL的基本功能,3 光照处理 包括发射光、环境光、散射光和镜面反射光。,参考书:分形算法与程序设计,99,OpenGL的基本功能,4 着色 OpenGL提供了两种物体着色模式,一种是RGBA颜色模式,另一种是颜色索引(Color Index)模式。,参考书:分形算法与程序设计,100,OpenGL的基本功能,5 反走样 在OpenGL绘制图形过程中,由于使用的是位图,所以绘制出的图像的边缘会出现锯齿形状,称为走样。为了消除这种缺陷,OpenGL提供了点、线、多边形的反走样技术。,参考书:分形算法与程序设计,101,OpenGL的基本功能,6 融合 为了使三维图形更加具有真实感,经常需要处理半透明或透明的物体图像,这就需要用到融合技术。,参考书:分形算法与程序设计,102,OpenGL的基本功能,7 雾化 正如自然界中存在烟雾一样,OpenGL提供了“fog”的基本操作来达到对场景进行雾化的效果。,参考书:分形算法与程序设计,103,OpenGL的基本功能,8 位图和图像 在图形绘制过程中,位图和图像是非常重要的一个方面。OpenGL提供了系列函数来实现位图和图像的操作。,参考书:分形算法与程序设计,104,OpenGL的基本功能,9 纹理映射 在计算机图形学中,把包含颜色、alpha值、亮度等数据的矩形数组称为纹理。而纹理映射可以理解为将纹理粘贴在所绘制的三维模型表面,以使三维图形显得更生动。,参考书:分形算法与程序设计,105,OpenGL的运行环境,10动画 出色的动画效果是OpenGL的一大特色,OpenGL提供了双缓存区技术来实现动画绘制。,参考书:分形算法与程序设计,106,OpenGL的基本函数,1顶点坐标 OpenGL采用有序排列的顶点集合来构造几何图元,而不是将线段、多边形组合起来构造几何图元。如:glVertex2s(2,5);/整数定义的二维坐标 glVertex3f(2,5,7);/浮点定义的三维坐标,参考书:分形算法与程序设计,107,OpenGL的基本函数,2顶点关系 在OpenGL中,同一个几何图元的所有被定义的顶点一起放在glBegin()和glEnd()函数之间,同时定义这些顶点之间的关系。如:glBegin(GL_POLYGON);glVertex2s(0,0);glVertex2s(0,11);glVertex2s(11,14);glVertex2s(14,7);glVertex2s(7,0);glEnd();,参考书:分形算法与程序设计,108,OpenGL的基本函数,3显示列表 OpenGL显示列表(Dispplay List)是由一组预先存储起来的留待以后调用的OpenGL函数语句组成的,当调用这张显示列表时就一次执行表中所列出的函数语句。创建显示列表 OpenGL用下面的函数组创建显示列表:void glNewList(GLuint list,GLenum mode);void glEndList(void);执行显示列表 显示列表的执行函数形式如下:void glCallList(GLuint list);参数list指定被执行的显示列表。,参考书:分形算法与程序设计,109,OpenGL的基本函数,4颜色设置 RGBA模式下的颜色定义在RGBA模式下,利用glColor*命令来定义当前颜色。glColor*命令有如下几种形式:void glColor3b s i f d ub us ui(TYPE r,TYPE g,TYPE b);void glColor4b s i f d ub us ui(TYPE r,TYPE g,TYPE b,TYPE a);void glColor3b s i f d ub us uiv(TYPE*v);void glColor4b s i f d ub us uiv(TYPE*v);在颜色索引模式下的颜色定义 通过调用函数glIndex*()从颜色索引表中选取当前颜色。void glIndex(s f d i)(c:TYPE);void glIndex(s f d i)v(c:PTYPE);,参考书:分形算法与程序设计,110,OpenGL的基本函数,5光照设置 创建光源(Light Source)光源有许多特性,如颜色、位置、方向等。可以使用下面的函数定义光源:void glLightifv(GLenum light,GLenum pname,TYPE param)启动光照 在OpenGL中,必须明确指出光照是否有效或无效。如果光照无效,则只是简单地将当前颜色映射到当前顶点上去,不进行法向、光源、材质等复杂计算,那么显示的图形就没有真实感。启动和取消光源的函数如下:glEnable(GL_LIGHTING);/启动光照 gDisable(GL_LIGHTING);/取消光照,参考书:分形算法与程序设计,111,OpenGL的基本函数,6明暗处理 在OpenGL中,用单一颜色处理的称为平面明暗处理(Flat Shading),用许多不同颜色处理的称为光滑明暗处理(Smooth Shading)。设置明暗处理模式的函数为:void glShadeModel(GLenum mode);,参考书:分形算法与程序设计,112,OpenGL的基本函数,7材质设置 材质定义材质的定义与光源的定义类似。其函数为:void glMaterialifv(GLenum face,GLenum pname,TYPE param);改变材质在OpenGL中提供了两种方式来改变场景中的材质。第一种方法是利用函数glMaterial*()来改变材质,但是调用函数glMaterial*()需要同时保存当前矩阵,也就是调用函数glPushMatrix()和glPopMatrix()。第二种方法是使用函数glColorMaterial(),其形式为:void glColorMaterial(GLenum face,GLenum mode);,参考书:分形算法与程序设计,113,OpenGL的基本函数,8纹理映射 纹理定义在程序中可以用以下函数定义二维纹理映射:void glTexImage2D(GLenum target,GLint level,GLint components,GLsizei width,Glsizei height,GLint border,GLenum format,GLenum type,const GLvoid*pixels);纹理控制OpenGL中控制纹理的函数是:void glTexParameterifv(GLenum target,GLenum pname,TYPE param);定义纹理坐标OpenGL坐标定义的函数是:void gltexCoord1 2 3 4s i f dv(TYPE coords);,参考书:分形算法与程序设计,114,OpenGL的基本函数,9选择与反馈 在OpenGL中,提供了选择和反馈两种方式,以实现对屏幕上的某个物体的信息提供,达到交互的目的。进行模式选择的函数原型如下:Lint glRenderMode(GLenum Mode);在进入选择模式之前,必须调用函数glSelectBuffer()来制定选择数组。在进入反馈模式之前,必须调用函数glFeedbackBuffer()来制定反馈数组。,参考书:分形算法与程序设计,115,OpenGL的基本函数,10帧缓存与动画 帧缓存的组成 OpenGL帧缓存由以下四种缓存组成:颜色缓存(Color Buffer)、深度缓存(Depth Buffer)、模板缓存(Stencil Buffer)、累积缓存(Accumulation Buffer)。缓存清除 OpenGL清除缓存操作过程是:先给出要写入每个缓存的清除值,然后用单个函数命令执行操作,传入所有要清除的缓存表。动画 OpenGL提供了双缓存,可以用来制作动画。也就是说,在显示前台缓存内容中的一帧画面时,后台缓存正在绘制下一帧画面,当绘制完毕,则后台缓存内容便在屏幕上显示出来,而前台正好相反,又在绘制下一帧画面内容。这样循环反复,屏幕上显示的总是已经画好的图形,于是看起来所有的画面都是连续的。,参考书:分形算法与程序设计,116,9.2,三维空间中的Sierpinski地毯,参考书:分形算法与程序设计,117,9.2,三维空间中的Sierpinski地毯,参考书:分形算法与程序设计,118,9.2,三维空间中的Sierpinski地毯,参考书:分形算法与程序设计,119,9.3,Sierpinski金字塔,参考书:分形算法与程序设计,120,9.3,Sierpinski金字塔,参考书:分形算法与程序设计,121,9.3,Sierpinski金字塔,参考书:分形算法与程序设计,122,9.4,Sierpinski海绵,参考书:分形算法与程序设计,123,9.4,Sierpinski海绵,参考书:分形算法与程序设计,124,9.4,Sierpinski海绵,参考书:分形算法与程序设计,125,9.4,Sierpinski海绵,参考书:分形算法与程序设计,126,9.4,Sierpinski海绵,参考书:分形算法与程序设计,127,9.4,Sierpinski海绵,参考书:分形算法与程序设计,128,9.4,Sierpinski海绵,参考书:分形算法与程序设计,129,9.4,Sierpinski海绵,参考书:分形算法与程序设计,130,第 10 章,分形自然景物模拟算法,9.1 随机中点位移法生成山,9.2 分形插值算法生成云和山,参考书:分形算法与程序设计,131,随机中点位移法生成山,10.1,1.一维中点位移法以一条水平地平线段开始重复足够多次对场景中的每条线段做找到线段的中点在Y方向上随机移动中点一段距离减小随机数取值范围,参考书:分形算法与程序设计,132,随机中点位移法生成山,10.1,1.一维中点位移法粗糙度常量。这个值决定每次循环随机数值域的减少量,也就是说,决定分形结果的粗糙程度。例如使用一个0.0到1.0之间的浮点数并称之为H。因此(a-h)是1.0(对于小H)到0.5(对大H)范围内的数。随机数范围在每次循环时乘上这个值。如果H设为1.0,则随机数范围将每次循环减半,从而得到一个非常平滑的分形。将H设为0.0,则范围根本不减小,结果有明显的锯齿感。,参考书:分形算法与程序设计,133,随机中点位移法生成山,10.1,2.二维中点位移法 上面是将索引(x值)映射为高度值(y值)。如果需要一个两维高度值数组,它将索引(x,z)映射为高度(y)。数组只需保存高度值(y)。水平面值(x和z)可以在分析数组时即时生成。通过对每个高度指定一个颜色,可以将一幅高度图显示为一幅图像。如下,高点为白色,低处为黑色。绘制高度图的方法对于生成云彩纹理图是很有用的。,参考书:分形算法与程序设计,134,随机中点位移法生成山,10.1,3.三维中点位移法 选择AB、AC、BC线段中点,并沿y方向分别加一个随机量h1、h2、h3,得到E、F、G点,其中,h1、h2、h3的取值范围相同。连接AE、BE、AF、CF、BG、CG,从而构成AEG、BEF、CFG、EFG等4个小三角形,并将原来的三角形ABC抹去。选择明暗不同的4种颜色,分别填充这4个三角形。分别基于上述形成的4个小三角形,重复执行上面的操作。,参考书:分形算法与程序设计,135,随机中点位移法生成山,10.1,3.三维中点位移法 在实现此算法时应避免出现山体裂痕。当每一级中点位移时,都是基于每一个独立的小三角形进行的,但由于各三角形之间有共用边,所以会出现共用被移位两次的情况,而且两次位移的高度会有所不同(因为移位中有随机量),这样便会出现裂痕。解决办法是,先移位三边都是共用的三角形,然后其他三角形在移位时,只移位非共用边即可。,参考书:分形算法与程序设计,136,10.2,分形插值算法生成云和山,在平面上划分正方形网络nn,随机给A、B、C、D四个角点的颜色;根据四个角点的颜色值的平均值,产生中点M的颜色;根据A、B、M点和网格外一虚拟点(颜色值为0)求平均,得到边中点E的颜色,根据B、C、M点和网格外一虚拟点(颜色值为0)求平均,得到边中点F的颜色,根据C、D、M点和网格外一虚拟点(颜色值为0)求平均,得到边中点G的颜色,根据A、D、M点和网格外一虚拟点(颜色值为0)求平均,得到边中点H的颜色;根据小正方形EBFM,四角点颜色的平均值,求出小正方形中点以及小正方形的边中点的颜色;然后再沿用上述规则计算小正方形MFCG的中点及边中点的颜色,以此类推,计算小正方形HMGD、AEMH的中点和边中点的颜色。,参考书:分形算法与程序设计,137,10.2,分形插值算法生成云和山,在X-Y平面上绘制一个nn的正方形网格,并对4个角点在Z方向上分别设置初始高度ha、hb、hc、hd,得到A、B、C、D四点;根据式hm=(ha+hb+hc+hd)/4+,计算正方形网格中点的高度hm,其中为一随机量,从而得到M点;根据角点和中点以及虚拟点,计算边中点的高度,即 he=(ha+hb+hm+0)/4+hf=(hb+hc+hm+0)/4+hg=(hc+hd+hm+0)/4+hh=(hd+ha+hm+0)/4+其中为一随机量,从而得到E、F、G、H四点;,参考书:分形算法与程序设计,138,10.2,分形插值算法生成云和山,再根据E、B、F、M四点的高度计算小正方形EBFM中点的高度,类似地计算小正方形MFCG、HMGD、AEMH中点的高度,即 he=(ha+hb+hm+he)/4+1 hf=(hb+hc+hm+hf)/4+1 hg=(hc+hd+hm+hg)/4+1 hh=(hd+ha+hm+hh)/4+1以及这些正方形边中点的高度;递归上面的步骤使正方形网格逐步细化,直至达到预期递归深度,然后连接每个正方形网格点。,