计算机分形讲义.docx
- 文档编号:18576956
- 上传时间:2023-08-19
- 格式:DOCX
- 页数:16
- 大小:303.38KB
计算机分形讲义.docx
《计算机分形讲义.docx》由会员分享,可在线阅读,更多相关《计算机分形讲义.docx(16页珍藏版)》请在冰点文库上搜索。
计算机分形讲义
计算机图形学实验报告
姓名
学号
专业
任课教师
实验教师
评阅教师
实验地点
书写日期
20
实验课时间
实验得分
实验序号与名称:
计算机分形——Koch曲线
实验目的:
通过实验了解计算机分形和粒子系统实现及其效果
实验开发环境:
硬件要求:
PC机,主流配置,最好为独立显卡,显存512M以上。
软件环境:
操作系统:
WindowsXP。
语言开发工具:
MicrosoftVisualstudio2008,VisualC++。
实验要求:
用OpenGL实现以下效果之一:
1、计算机分形 例如Julia集Koch曲线2D或3DSierpinsk三角形
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.1koch雪花
在一单位长度的线段上对其三等分,将中间段直线换成一个去掉底边的等边三角形,再在每条直线上重复以上操作,如此进行下去直到无穷,就得到分形曲线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){
//初始化画线
}
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,当l 2.2koch树 算法步骤类似于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雪花曲线绘制 voidkoch(doublex1,doubley1,doublex2,doubley2,intdepth) { doublex4=x1*2/3+x2*1/3; doubley4=y1*2/3+y2*1/3; doublex5=x1*1/3+x2*2/3; doubley5=y1*1/3+y2*2/3; doublex3=(x4+x5)/2+(y4-y5)*sqrt(3.0)/2; doubley3=(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,y4); 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); } } voiddrawKoch(void) { glColor3f(1.0,0.3,0.8);//设置红色绘图颜色 selectFont(48,GB2312_CHARSET,"楷体");//设置字体楷体48号字 glRasterPos2f(270,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树曲线绘制 voidtree(doublex1,doubley1,doublex2,doubley2,intdepth) { doublec=8; doublex3=x2+(c/sin(50.0)),y3=y2+(y1-y2)/5; doublea3=x2,b3=y2+(y1-y2)/2,a4=x2,b4=y2+(y1-y2)/3; doublex4=x1*2/3+x2*1/3; doubley4=y1*2/3+y2*1/3; doublex5=x1*1/3+x2*2/3; doubley5=y1*1/3+y2*2/3; doublex6=(x4+x5)/2+(y4-y5)*sqrt(5.0)/2; doubley6=(y4+y5)/2+(x5-x4)*sqrt(5.0)/2; doublex7=(x2+x5)/2+(y2-y5)*sqrt(3.0)/2; doubley7=(y2+y5)/2+(x5-x2)*sqrt(3.0)/2; doublex8=(x5+x4)/2+(y5-y4)*sqrt(7.0)/2; doubley8=(y5+y4)/2+(x4-x5)*sqrt(7.0)/2; doublex9=(x5+x2)/2+(y5-y2)*sqrt(3.0)/2; doubley9=(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,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(); }else{ glColor3f(0,0.5,0); glBegin(GL_LINE_STRIP); 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); }} voiddrawTree(void) { sky(); movesun(); tree(400,100,400,600,m); } (3)操作说明 voidmenu(void) { glColor3f(1,0.7,0);//设置红色绘图颜色 selectFont(48,GB2312_CHARSET,"楷体");//设置字体楷体48号字 glRasterPos2f(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-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)键盘交互 voidmykeyboard(unsignedcharkey,intx,inty)//键盘交互 { 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(); } (4)鼠标交互 voidmyMouse(intbutton,intstate,intx,inty) { if(button==GLUT_LEFT_BUTTON&&state==GLUT_DOWN) { if(flag==1) { k+=1; } if(flag==2) { m+=1; } } } (5)显示函数 voiddisplay(void) { glClearColor(0.0f,0.0f,0.0f,0.0f);//设置清屏颜色 glClear(GL_COLOR_BUFFER_BIT);//刷新颜色缓冲区; glMatrixMode(GL_MODELVIEW);//设置矩阵模式为模型变换模式,表示在世界坐标系下 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]混沌的计算实验与分析于万波著科学出版社,2008 [3]Koch雪花曲线的制作及其重要结论《长春师范大学学报》,2003,第1期: 6-8 [4]基于分形理论的图形设计研究与应用帅昌浩著《西安科技大学》,2008
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 讲义