1课程设计课程名称:计算机图形学与可视化学生姓名:学号:专业班级:指导老师:院系名称:2课程设计任务书设计题目利用迭代函数系统生成分形图案成绩课程设计主要内容迭代函数系统(IterationFunctionSystem,简称IFS)是以仿射变换为框架,根据几何对象的整体与局部具有自相似的结构,将总体形状以一定的概率按不同的仿射变换迭代下去,直至得到满意的分型图形。迭代函数系统绘制分形图形有两种方法:确定性迭代算法和随机性迭代算法。本文将以此原理出发,分析分形图形的生成方法,探索一些利用IFS产生丰富的分形图形的简便方法及具体应用。具体内容请看下面的正文。指导教师评语建议:从学生的工作态度、工作量、设计(论文)的创造性、学术性、实用性及书面表达能力等方面给出评价。签名:20年月日3目录一.系统功能介绍…………………………………………………4二.设计思路………………………………………………………6三.模块图…………………………………………………………6四.小组成员及任务分配…………………………………………7五.主要算法介绍…………………………………………………7六.源代码…………………………………………………………8七.程序使用说明…………………………………………………8八.调试结果………………………………………………………8九.总结……………………………………………………………14十.参考文献………………………………………………………154正文:一.系统功能介绍迭代函数系统(IterationFunctionSystem,简称IFS)最早是由Hutchision在1981年提出的。美国佐治亚理工学院的MFBamsley等人在SIGGRAMPH’88国际会议上对IFS所作的专题报告,使IFS成为分形图像压缩的基础,从而使IFS成为分形图形学最有生命力的领域之一。迭代函数系统(IFS)是以仿射变换为框架,根据几何对象的整体与局部具有自相似的结构,将总体形状以一定的概率按不同的仿射变换迭代下去,直至得到满意的分形图形。目前使用的迭代函数系统绘制分形图的算法主要有两种:确定性迭代算法和随机性迭代算法。它们都是通过IFS码进行迭代而产生图形的方法。确定性迭代算法是通过仿射变换得到的。其基本原理就是找一个初始集,对集上的每一个点,根据给定的仿射变换公式进行数据变换,便可得到新的点集。这样通过多次迭代,便可绘制所需的图形。并且每个图形的局部和整体相似。只要其仿射变换系数相同,即IFS码相同,当迭代次数足够大时,最终生成的图形是相同的。随机性迭代算法用到了概率,从而可以对图形的细节和颜色进行控制。随机性迭代算法的基本原理就是利用一个给定的IFS码{:j=1,2,…,N}(每一个仿射变换对应于一个概率),从任选的一个初始点(,)出发,依据其概率分布{,,,…,},从{:j=1,2,…,N}中选择相应的进行仿射变换,可得到新的点(,)。然后再由概率选择相应的进行变换,进而得到新的点(,)。这样反复迭代,便可得到一系列的点{(,),(,),(,),…}。这些点集显示在屏幕上,便得到一个完整的分形图。分形,又称碎形,通常被定义为“一个粗糙或零碎的几何形状,可以分成数个部分,且每一部分都(至少近似地)是整体缩小后的形状”,即具有自相似的性质。分形思想的根源可以追溯到公元17世纪,而对分形使用严格的数学处理则始于一个世纪后卡尔·魏尔施特拉斯、格奥尔格·康托尔和费利克斯·豪斯多夫对连续而不可微函数的研究。但是分形一词直到1975年才由本华·曼德博创造出,来自拉丁文,有“零碎”、“破裂”之意。一个数学意义上分形的生成是基于一个不断迭代的方程式,即一种基于递归的反馈系统。分形有几种类型,可以分别依据表现出的精确自相似性、半自相似性和统计自相似性来定义。虽然分形是一个数学构造,它们同样可以在自然界中被找到,这使得它们被划入艺术作5品的范畴。分形在医学、土力学、地震学和技术分析中都有应用。分形一般有以下特质:1、在任意小的尺度上都能有精细的结构;2、太不规则,以至无论是其整体或局部都难以用传统欧氏几何的语言来描述;3、具有(至少是近似的或统计的)自相似形式;4、一般地,其“分形维数”会大于拓扑维数;5、在多数情况下有着简单的递归定义。因为分形在所有的大小尺度下都显得相似,所以通常被认为是无限复杂的。自然界里一定程度上类似分形的事物有云、山脉、闪电、海岸线、雪片、植物根、多种蔬菜(如花椰菜和西兰花)和动物的毛皮的图案等等。但是,并不是所有自相似的东西都是分形,如实直线虽然在形式上是自相似的,但却不符合分形的其他特质,比如说它能被传统的欧氏几何语言所描述。四个制造分形的一般技术如下:1、逃逸时间分形:由空间(如复平面)中每一点的递推关系式所定义,例如曼德博集合、茹利亚集合、火烧船分形、新分形和李奥普诺夫分形等。由一次或两次逃逸时间公式的迭代生成的二维向量场也会产生分形,若点在此一向量场中重复地被通过。2、迭代函数系统:这些分形都有着固定的几何替代规则。康托尔集、谢尔宾斯基三角形、谢尔宾斯基地毯、空间填充曲线、科赫雪花、龙形曲线、丁字方形、门格海绵等都是此类分形的一些例子。3、随机分形:由随机而无确定过程产生,如布朗运动的轨迹、莱维飞行、分形风景和布朗树等。后者会产生一种称之为树状分形的分形,如扩散限制聚集或反应限制聚集丛。4、奇异吸引子:以一个映射的迭代或一套会显出混沌的初值微分方程所产生。分形也可以依据其自相似来分类,有如下三种:1、精确自相似:这是最强的一种自相似,分形在任一尺度下都显得一样。由迭代函数系统定义出的分形通常会展现出精确自相似来。2、半自相似:这是一种较松的自相似,分形在不同尺度下会显得大略(但非精确)相同。半自相似分形包含有整个分形扭曲及退化形式的缩小尺寸。由递推关系式定义出的分形通常会是半自相似,但不会是精确自相似。3、统计自相似:这是最弱的一种自相似,这种分形在不同尺度下都能保有固定6的数值或统计测度。大多数对“分形”合理的定义自然会导致某一类型的统计自相似(分形维数本身即是个在不同尺度下都保持固定的数值测度)。随机分形是统计自相似,但非精确及半自相似的分形的一个例子。应用:医学中组织切片的归类分形风景或海岸线复杂性制作许多的艺术形式地震学土壤力学中的分形电脑及电视游戏设计,尤其是有机背景的CG和部分的过程生成二.设计思路分形算法:把四面体细分成更小的四面体,先找出其6个棱的中点并连接起来,这样就在4个顶点处各有一个小的四面体,原来四面体中剩下的部分应当去掉。仿效二维的生成方法,我们对保留的四个小四面体进行迭代细分。这样细分结束后通过绘制4个三角形来绘制每一个剩下的四面体。交互的实现:键盘交互,即通过对按键的响应写上响应函数实现对视图和颜色的改变。鼠标交互:通过对鼠标左右键的交互。三.模块图四面体分形算法键盘响应鼠标响应初始标色颜色方案视图方案右键视图变换、颜色变换、退出图形中拾取一点按键1、2、3、4切换四面颜色分形算法7四.小组成员及任务分配:分形算法实现;查找资料:颜色方案、视图方案算法实现;编写课程设计报告:键盘、鼠标响应算法实现;编写课程设计报告五.主要算法介绍分形算法:voidtetra(GLfloat*a,GLfloat*b,GLfloat*c,GLfloat*d)函数实现的是绘制四面体并且给四个面绘上不同的颜色。voidtriangle3(GLfloat*a,GLfloat*b,GLfloat*c)函数用来绘制每个平面细分后的三角形。其中顶点设置为3维坐标glVertex3fv(a);voiddivide_tetra(GLfloat*a,GLfloat*b,GLfloat*c,GLfloat*d,intm)细分四面体的函数实现。前四个参数为传入点的坐标,最后参数m则是细分次数。先计算六个中点的坐标mid[1][j]=(a[j]+c[j])/2;3次循环则是对x,y,z三个坐标的一次计算,然后再递归调用绘制4个小四面体。然后是显示回调函数voidmydisplay3FX();分形算法中必要重要的一点是隐藏面的消除。对对象进行排序以正确绘制他们的算法称为可见表面算法,也课称为隐藏面消除算法。这里采用的死Z-缓存算法。在主程序中申请辅助存储器:一个Z(深度)缓存,为此把初始化代码改为glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB|GLUT_DEPTH);递归结束的时候调用函数:glEnable(GL_DEPTH_TEST);算法在深度缓存中存储信息,所以必须在需要重绘的窗口清空这个缓存。为此把函数中的清屏操作改为:glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);键盘交互通过键盘回调函数glutKeyboardFunc(myKeyboard)来调用键盘响应函数,响应事件则在voidmyKeyboard()中具体实现。分别判断按下的按键的具体值,然后通过改变colors数组的值以及视图函数来改变现实,所用的颜色索引保存在colorChange数组之中。鼠标交互:其中用到了鼠标事件(mouseevent)和移动事件(moveevent)然后分别通过回调函数glutMouseFunc(myMouse),glutMotionFunc(myMotion);来调用。代码中对与鼠标单击相应即视角的移动,先通过点击的位置获取点下的坐标,用来判断是否在四面体内部的函数用glReadPixels(x,500-y,1,1,GL_RGB,8GL_FLOAT,pix)来实现。该函数读取点击位置的像素,将获取的结果存入数组pix在后面的判断算法中如果像素不为0则拾取该图形。该算法的好处是不需要计算复杂的坐标和线段函数而能方便的拾取对象。缺点则是在内部的白色区域点击不能够拾取图像。具体代码的实实现函数voidmyMouse(intbtn,intstate,intx,inty)移动相应函数voidmyMotion(intx,inty)首先对于移动过程中获取的坐标与全局变量定义的坐标统一数量级。所以在代码开头除以150,然后对每个点的坐标以此做改变,并将这次获取的坐标存入x0,y0中作为移动到下一个坐标的起始坐标在移动过程中就不停地循环调用该函数。程序还对右击的事件弹出菜单做了响应,该响应是通过main函数的glutAttachMenu(GLUT_RIGHT_BUTTON);代码实现,即将所设计的菜单加到右击事件中。具体菜单的设计见main函数事件的响应在voidmain_menu(int),voidcolor_menu(int);两个函数中而color_menu则是作为main_menu中的一个子菜单.其中对不同的事件做了响应。六.源代码详见附录。七.程序使用说明键盘交互:分别按下键盘上的数字键1,2,3,4可以分别改变四面体的4个面的颜色;鼠标交互:打开后在绘图的区域按下鼠标左键不放便可以拖动图形的视角,这里为了展现图形的3D效果因此固定了其中一点不放,这样就可以看到3D的效果;鼠标右击则有弹出菜单显示,其中改变颜色则是同时改变4个面的颜色,本程序中运用了8组配色方案;改变视图函数也是上述的3种函数,这里的效果立刻显现。八.调试结果1.程序直接运行出的图形展示92.将运行窗口进行放大,四面体展示透视视图3.单击鼠标右键,进行鼠标响应事件,包含四面体颜色变换、视图变换、退出104.展示颜色方案1-8114.展示变换视图函数1-35.点击退出,退出运行界面6.键盘响应事件,依次点击1、2、3、4,即进行一套颜色切换12137.鼠标拖动响应事件,点击拾取一点,可对图形围绕一点进行拖动14九.总结该程序中,结合了openGL很多函数的应用,首先是基础实现函数及模板过程的编写。然后就是分形算法的分析,虽然大部分是参考书中的代码,但是在具体实现时还是加入很多自己的想法。还有就是与用户的交互,从鼠标和键盘两个角度,加入了一些基本的事件响应,虽然功能不是很强大,但是初始学习