计算机分形剖析 - 图文

更新时间: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

本文来源:https://www.bwwdw.com/article/mw2p.html

Top