ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:207.73KB ,
资源ID:22781983      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22781983.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(计算机分形剖析.docx)为本站会员(b****2)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

计算机分形剖析.docx

1、计算机分形剖析计算机图形学实验报告姓名学号专业任课教师 实验教师评阅教师实验地点书写日期20实验课时间 实验得分实验序号与名称:计算机分形Koch曲线实验目的:通过实验了解计算机分形和粒子系统实现及其效果实验开发环境:硬件要求:PC机,主流配置,最好为独立显卡,显存512M以上。 软件环境:操作系统:Windows XP。语言开发工具:Microsoft Visual studio 2008,Visual C+。实验要求:用OpenGL实现以下效果之一:1、 计算机分形 例如 Julia集 Koch 曲线 2D或3D Sierpinsk三角形2、粒子系统 3、扫描表示法造型 并加上一定交互效果

2、需要提供: 1、源程序及其执行程序 2、程序设计、实现和操作说明实验内容与步骤小结、主要截图、核心代码实现:比例:60% 1、 koch曲线分形原理从一条直线段开始,将线段中间三分之一部分用等边三角形的两条边代替,形成具有5个结点的图形(图1);在新的图形中,又将图中每一条直线段中间的三分之一部分都用一条等边三角形的两条边代替,再次形成新的图形(图2),这时,图形中共有17个结点。设第k次迭代产生结点数为nk,第k+1次迭代产生结点数为nk+1,则kn和kn+1之间的递推关系式为nk+1 =4*nk -3。图1 第一次迭代 图2 第二次迭代2、 算法分析 2.1 koch雪花 在一单位长度的线

3、段上对其三等分,将中间段直线换成一个去掉底边的等边三角形,再在每条直线上重复以上操作,如此进行下去直到无穷,就得到分形曲线Koch曲线。1. 给定初始直线(x1,y1)、(x2,y2),按Koch曲线的构成原理计算出各关键点坐标如下:x4 = x1 *2/3 + x2* 1/3;y4 = y1 *2/3 + y2* 1/3;x5 = x1 *1/3 + x2* 2/3;y5 = y1 *1/3 + y2* 2/3;x3 = (x4 + x5) /2 + (y4-y5)* sqrt(3.0)/2;y3 = (y4 + y5) /2 + (x5-x4)* sqrt(3.0)/2;2. 2.利用递归

4、算法,将计算出来的新点分别对应于(x1,y1)、(x2,y2),然后利用步骤1中的计算公式计算出下一级新点(x4, y4),(x5,y5),(x3,y3),并压入堆栈。 if(depth= 1) /初始化画线 else./递归 koch(x1,y1,x4,y4,depth-1); koch(x4,y4,x3,y3,depth-1); koch(x3,y3,x5,y5,depth-1); koch(x5,y5,x2,y2,depth-1); 3. 给定一个小量c,当lc时,被压入堆栈中的值依次释放完毕,同时绘制直线段x1,y1)、(x2,y2),然后结束程序.2.2 koch树算法步骤类似于ko

5、ch雪花,只是初始化不同: c= 8; x3 =x2 +(c/ sin(50.0), y3 =y2 +(y1 -y2)/ 5; a3 =x2, b3 =y2 +(y1 -y2)/ 2, a4 =x2, b4=y2+(y1 -y2)/3; x4 =x1* 2 / 3 +x2* 1 / 3; y4 =y1* 2 / 3 +y2* 1 / 3; x5 =x1* 1 / 3 +x2* 2 / 3; y5 =y1* 1 / 3 +y2* 2 / 3; x6 =(x4 +x5)/ 2 +(y4 -y5)* sqrt(5.0)/ 2; y6 =(y4 +y5)/ 2 +(x5 -x4)* sqrt(5.0)

6、/ 2; x7 =(x2 +x5)/ 2 +(y2 -y5)* sqrt(3.0)/ 2; y7 =(y2 +y5)/ 2 +(x5 -x2)* sqrt(3.0)/ 2; x8 =(x5 +x4)/ 2 +(y5 -y4)* sqrt(7.0)/ 2; y8 =(y5 +y4)/ 2 +(x4 -x5)* sqrt(7.0)/ 2; x9 =(x5 +x2)/ 2 +(y5 -y2)* sqrt(3.0)/ 2; y9 =(y5 +y2)/ 2 +(x2 -x5)* sqrt(3.0)/ 2; if(depth= 1) /初始化画线 else./递归 koch(x1,y1,x4,y4,dep

7、th-1); koch(x4,y4,x3,y3,depth-1); koch(x3,y3,x5,y5,depth-1); koch(x5,y5,x2,y2,depth-1); 3、 功能设计(1)鼠标:点击屏幕,进行递归绘制koch曲线绘制雪花图形和分形树;(2)键盘交互按键1和2切换两个图形界面;(3)键盘交互按键A、a和S、s切换koch雪花的两种渐变颜色。4、 功能实现3.1核心代码(1)koch雪花曲线绘制void koch(double x1,double y1,double x2,double y2,int depth) double x4 = x1 *2/3 + x2* 1/3;

8、 double y4 = y1 *2/3 + y2* 1/3; double x5 = x1 *1/3 + x2* 2/3; double y5 = y1 *1/3 + y2* 2/3; double x3 = (x4 + x5) /2 + (y4-y5)* sqrt(3.0)/2; double y3 = (y4 + y5) /2 + (x5-x4)* sqrt(3.0)/2; if(depth= 1) glColor3f(0.5*color1,x3/500,y3/300); glBegin(GL_LINE_STRIP); glVertex2d(x1,y1); glVertex2d(x4,y

9、4); glVertex2d(x3,y3); glVertex2d(x5,y5); glVertex2d(x2,y2); glEnd(); else koch(x1,y1,x4,y4,depth-1); koch(x4,y4,x3,y3,depth-1); koch(x3,y3,x5,y5,depth-1); koch(x5,y5,x2,y2,depth-1); void drawKoch(void) glColor3f(1.0,0.3,0.8); /设置红色绘图颜色 selectFont(48, GB2312_CHARSET, 楷体); /设置字体楷体48号字 glRasterPos2f(2

10、70, 400); /在世界坐标250,250处定位首字位置 drawCNString(Koch 雪花); /写字“Hello,大家好” glTranslatef(cx,cy,0); /平移回去 glRotatef(theta1,0,0,1); /绕原点旋转ALPHA角度 glTranslatef(-cx,-cy,0); /平移回原点 koch(150,250,400,sqrt(3.0)*250+250,k); koch(400,sqrt(3.0)*250+250,650,250,k);/ koch(650,250,150,250,k);(2)koch树曲线绘制void tree(double

11、 x1,double y1,double x2,double y2,int depth) double c= 8; double x3 =x2 +(c/ sin(50.0), y3 =y2 +(y1 -y2)/ 5; double a3 =x2, b3 =y2 +(y1 -y2)/ 2, a4 =x2, b4=y2+(y1 -y2)/3; double x4 =x1* 2 / 3 +x2* 1 / 3; double y4 =y1* 2 / 3 +y2* 1 / 3; double x5 =x1* 1 / 3 +x2* 2 / 3; double y5 =y1* 1 / 3 +y2* 2 /

12、3; double x6 =(x4 +x5)/ 2 +(y4 -y5)* sqrt(5.0)/ 2; double y6 =(y4 +y5)/ 2 +(x5 -x4)* sqrt(5.0)/ 2; double x7 =(x2 +x5)/ 2 +(y2 -y5)* sqrt(3.0)/ 2; double y7 =(y2 +y5)/ 2 +(x5 -x2)* sqrt(3.0)/ 2; double x8 =(x5 +x4)/ 2 +(y5 -y4)* sqrt(7.0)/ 2; double y8 =(y5 +y4)/ 2 +(x4 -x5)* sqrt(7.0)/ 2; double x9

13、 =(x5 +x2)/ 2 +(y5 -y2)* sqrt(3.0)/ 2; double y9 =(y5 +y2)/ 2 +(x2 -x5)* sqrt(3.0)/ 2; if(depth=1) glColor3f(0,0.5,0); glBegin(GL_LINE_STRIP); glVertex2d(x1,y1); glVertex2d(x2,y2); glEnd(); glBegin(GL_LINE_STRIP); glVertex2d(x5,y5); glVertex2d(x7,y7); glEnd(); glBegin(GL_LINE_STRIP); glVertex2d(x4,y

14、4); glVertex2d(x6,y6); glEnd(); glBegin(GL_LINE_STRIP); glVertex2d(x5,y5); glVertex2d(x9,y9); glEnd(); glBegin(GL_LINE_STRIP); glVertex2d(x4,y4); glVertex2d(x8,y8); glEnd(); else glColor3f(0,0.5,0); glBegin(GL_LINE_STRIP); glVertex2d(x5,y5); glVertex2d(x7,y7); glEnd(); glBegin(GL_LINE_STRIP); glVert

15、ex2d(x1,y1); glVertex2d(x2,y2); glEnd(); glBegin(GL_LINE_STRIP); glVertex2d(x4,y4); glVertex2d(x6,y6); glEnd(); glBegin(GL_LINE_STRIP); glVertex2d(x4,y4); glVertex2d(x8,y8); glEnd(); glBegin(GL_LINE_STRIP); glVertex2d(x5,y5); glVertex2d(x9,y9); glEnd(); glBegin(GL_LINE_STRIP); tree(x5, y5, x2, y2, d

16、epth-1); tree(x4, y4, x6, y6, depth-1); tree(x5, y5, x7, y7, depth-1); tree(x4, y4, x8, y8, depth-1); tree(x5, y5, x9, y9, depth-1); void drawTree(void) sky(); movesun(); tree(400,100 ,400, 600,m);(3)操作说明void menu(void) glColor3f(1,0.7,0); /设置红色绘图颜色 selectFont(48, GB2312_CHARSET, 楷体); /设置字体楷体48号字 gl

17、RasterPos2f(270, 400); /在世界坐标250,250处定位首字位置 drawCNString(Koch 雪花); /写字“Hello,大家好” glColor3f(1,0.7,0.9); selectFont(20, GB2312_CHARSET, 楷体); /设置字体楷体48号字/*楷体*/ glRasterPos2f(z1,z2+10); /定位首字位置 drawCNString(操作规则:); /写字“Hello,大家好” selectFont(20, GB2312_CHARSET, 楷体); /设置字体楷体48号字/*楷体*/ glRasterPos2f(z1,z2

18、-10); /定位首字位置 drawCNString(1)按键1进入koch树); glRasterPos2f(z1,z2-30); /定位首字位置 drawCNString(*按键2回到koch雪花); glRasterPos2f(z1,z2-50); /定位首字位置 drawCNString(*鼠标点击进行分形); glRasterPos2f(z1,z2-70); /定位首字位置 drawCNString(*按键A或a 变换第一种渐进色颜色); glRasterPos2f(z1,z2-90); /定位首字位置 drawCNString(2)按键S或s 变换第二种渐进色颜色); (4)键盘交

19、互void mykeyboard(unsigned char key, int x, int y)/键盘交互 switch(key) case A: color1 =2; break; case a:/矩形对角坐标变量修改使得矩形左移 color1 =2; break; case D: color1 =0.3; break; case d:/矩形对角坐标变量修改使得矩形右移 color1 =0.3; break; case 1: flag = 2; break; case 2: flag = 1; break; /参数修改后调用重画函数,屏幕图形将发生改变 glutPostRedisplay(

20、); (4)鼠标交互void myMouse(int button,int state,int x,int y) if(button=GLUT_LEFT_BUTTON&state=GLUT_DOWN) if(flag =1) k+=1; if(flag =2) m+=1; (5)显示函数void display(void) glClearColor(0.0f, 0.0f, 0.0f, 0.0f); /设置清屏颜色 glClear(GL_COLOR_BUFFER_BIT); /刷新颜色缓冲区; glMatrixMode(GL_MODELVIEW); /设置矩阵模式为模型变换模式,表示在世界坐标系

21、下 glLoadIdentity(); /将当前矩阵设置为单位矩阵 if(flag =1) glClearColor(0.0f, 0.0f, 0.0f, 0.0f); /设置清屏颜色 drawKoch();/koch雪花 if(flag =2) glClearColor(1.0f, 1.0f, 1.0f, 1.0f); /设置清屏颜色 drawTree();/koch树 glFlush(); /用于刷新命令队列和缓冲区,使所有尚未被执行的OpenGL命令得到执行;3. 2效果截图: (1)点击屏幕,递归显示koch曲线雪花 递归一次:k =1 递归二次:k =2 递归三次:k =3 递归N次:k =N(2)按键A或a换第一种渐变色 按键S或s换第二种渐变色; (3)按键1,切换到koch树的界面,点击屏幕开始递归分析 递归一次:k =1 递归二次:k =2 递归三次:k =3 递归N次:k =N(4)按键2,切换到koch雪花的界面 参考文献:1 分形算法与程序设计java实现 孙博文 著 科学出版社,2004 2 混沌的计算实验与分析 于万波 著 科学出版社,20083 Koch雪花曲线的制作及其重要结论 长春师范大学学报, 2003, 第1期:6-84 基于分形理论的图形设计研究与应用 帅昌浩 著 西安科技大学, 2008

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1