计算机分形剖析 - 图文
更新时间:2024-04-19 19:28:01 阅读量: 综合文库 文档下载
- 计算机分形图推荐度:
- 相关推荐
计算机图形学实验报告
姓名 学号 专业 评阅教师 20 任课教师 实验地点 实验课时间 实验得分 实验教师 书写日期 实验序号与名称:计算机分形——Koch曲线 实验目的: 通过实验了解计算机分形和粒子系统实现及其效果 实验开发环境: 硬件要求: PC机,主流配置,最好为独立显卡,显存512M以上。 软件环境: 操作系统:Windows XP。 语言开发工具:Microsoft Visual studio 2008,Visual C++。 实验要求: 用OpenGL实现以下效果之一: 1、 计算机分形 例如 Julia集 Koch 曲线 2D或3D Sierpinsk三角形 2、粒子系统 3、扫描表示法造型 并加上一定交互效果 需要提供: 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雪花
在一单位长度的线段上对其三等分,将中间段直线换成一个去掉底边的等边三角形,再在每条直线上重复以上操作,如此进行下去直到无穷,就得到分形曲线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.利用递归算法,将计算出来的新点分别对应于(x1,y1)、(x2,y2)),然后利用步
骤1中的计算公式计算出下一级新点(x4, y4),(x5,y5),(x3,y3),并压入堆栈。
if(depth<= 1){
//初始化画线 }
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);
else{.//递归
}
3. 给定一个小量c,当l 2.2 koch树 算法步骤类似于koch雪花,只是初始化不同: 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)/ 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,depth-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; 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){ } 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); glColor3f(0.5*color1,x3/500,y3/300); glBegin(GL_LINE_STRIP); glVertex2d(x1,y1); glVertex2d(x4,y4); glVertex2d(x3,y3); glVertex2d(x5,y5); glVertex2d(x2,y2); glEnd(); void drawKoch(void) { 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); glRotatef(theta1,0,0,1); //绕原点旋转ALPHA角度 glTranslatef(-cx,-cy,0); //平移回原点 glColor3f(1.0,0.3,0.8); //设置红色绘图颜色 selectFont(48, GB2312_CHARSET, \楷体_GB2312\); //设置字体楷体48号字 drawCNString(\雪花\); //写字“Hello,大家好” glRasterPos2f(270, 400); //在世界坐标250,250处定位首字位置 (2)koch树曲线绘制 void tree(double x1,double y1,double x2,double y2,int depth) { 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 / 3; double c= 8; 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 =(x5 +x2)/ 2 +(y5 -y2)* sqrt(3.0)/ 2; double y9 =(y5 +y2)/ 2 +(x2 -x5)* sqrt(3.0)/ 2; if(depth<=1){ }else { glColor3f(0,0.5,0); glBegin(GL_LINE_STRIP); 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,y4); 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(); { } }} glVertex2d(x5,y5); glVertex2d(x7,y7); glEnd(); glBegin(GL_LINE_STRIP); glVertex2d(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, depth-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, \楷体_GB2312\); //设置字体楷体48号字 drawCNString(\雪花\); //写字“Hello,大家好” glRasterPos2f(270, 400); //在世界坐标250,250处定位首字位置 } glColor3f(1,0.7,0.9); selectFont(20, GB2312_CHARSET, \楷体_GB2312\); //设置字体楷体48号字/*楷体_GB2312*/ glRasterPos2f(z1,z2+10); //定位首字位置 drawCNString(\操作规则:\); //写字“Hello,大家好” selectFont(20, GB2312_CHARSET, \楷体_GB2312\); //设置字体楷体48号字/*楷体_GB2312*/ glRasterPos2f(z1,z2-10); //定位首字位置 drawCNString(\按键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(\按键S或s 变换第二种渐进色颜色\); (4)键盘交互 void mykeyboard(unsigned char key, int x, int y)//键盘交互 { switch(key) { case 'A': } //参数修改后调用重画函数,屏幕图形将发生改变 color1 =2; break; color1 =2; break; color1 =0.3; break; color1 =0.3; break; flag = 2;; break; flag = 1;; break; case 'a'://矩形对角坐标变量修改使得矩形左移 case 'D': case 'd'://矩形对角坐标变量修改使得矩形右移 case '1': case '2': } glutPostRedisplay(); (4)鼠标交互 void myMouse(int button,int state,int x,int y) { } } if(flag ==2) { } m+=1; if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN) { if(flag ==1) { } k+=1; (5)显示函数 void display(void) { } glMatrixMode(GL_MODELVIEW); //设置矩阵模式为模型变换模式,表示在世界坐标系下 glLoadIdentity(); //将当前矩阵设置为单位矩阵 { } if(flag ==2){ } glFlush(); //用于刷新命令队列和缓冲区,使所有尚未被执行的OpenGL命令得到执行; glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置清屏颜色 drawTree();//koch树 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置清屏颜色 glClearColor(0.0f, 0.0f, 0.0f, 0.0f); //设置清屏颜色 glClear(GL_COLOR_BUFFER_BIT); //刷新颜色缓冲区; if(flag ==1) drawKoch();//koch雪花 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] 混沌的计算实验与分析 于万波 著 科学出版社,2008 [3] Koch雪花曲线的制作及其重要结论 《长春师范大学学报》, 2003, 第1期:6-8 [4] 基于分形理论的图形设计研究与应用 帅昌浩 著 《西安科技大学》, 2008 递归三次:k =3 递归N次:k =N (4)按键2,切换到koch雪花的界面 参考文献: [1] 分形算法与程序设计—java实现 孙博文 著 科学出版社,2004 [2] 混沌的计算实验与分析 于万波 著 科学出版社,2008 [3] Koch雪花曲线的制作及其重要结论 《长春师范大学学报》, 2003, 第1期:6-8 [4] 基于分形理论的图形设计研究与应用 帅昌浩 著 《西安科技大学》, 2008
正在阅读:
计算机分形剖析 - 图文04-19
浇注料施工方案04-09
外国建筑史试题110-10
变电二次设备清扫标准化作业书11-05
《有机化学》复习资料-李月明05-10
直流脉宽调制调速系统控制器05-26
五大发展理念答案05-16
土质学与土力学习题及答案12-06
文秘人才市场调查03-11
淘宝直播需要什么条件-易店无忧12-14
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 剖析
- 图文
- 计算机
- 通讯的体裁特征与写作
- 火影忍者经典台词
- 顺应变革 抓住PPP市场机遇
- (2013春)七年级报纸电子版·牛津深圳版(第07期) - 图文
- 数据库原理-实验2-交互式SQL
- 小学四年级一班家长会教师发言稿
- 百家益激光治疗仪健康手册准版
- 实验05 单表查询
- 高考生最喜爱百强大学榜发布
- 班级文化建设论文
- 20150922市规划国土委关于明确城市更新项目地价测算有关事项的通
- 塔吊覆盖区域安全防护施工方案
- 新加坡城市规划建设的启示
- 2008年7月份政府采购基本情况统计表
- Windows2008安全事件ID说明
- 更换桌椅申请报告
- 内蒙古锦联二期电厂2X660WM机组接入系统电气初设说明书 - 图文
- 奥尔夫教材
- 高层建筑室内燃气管道设计的要点
- 流体力学试题