欢迎来到天天文库
浏览记录
ID:11592300
大小:1.19 MB
页数:75页
时间:2018-07-12
《计算机图形学(徐长青、许志闻)第六章 形体的表示以及数据结构》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第六章形体的表示以及数据结构第一节 分形图的递归算法本节主要介绍几种简单分形图的递归算法实现1.1 Cantor三分集Cantor三分集的构造如下图所示,一条线段ab被均分为三段,保留其两边的两段,中间一段去掉,然后把得到的每一段再继续进行划分,如此反复。 (1)创建应用程序框架,以单文档程序框架为基础,建立工程名称为cantor的单文档应用程序框架(2)添加视图类CCantorView的成员函数,voidcantor(CPointp0,CPointp1);(3)程序结构代码,在CCantorView.cpp文件中相应位置添加如下代码voi
2、dCCantorView::cantor(CPointp0,CPointp1){CClientDCpDC(this);intdis=20;//直线长度的精度,控制递归次数if((p1.x-p0.x)3、3.y=p1.y+80;p0.y=p0.y+80;p1.y=p1.y+80;cantor(p0,p2);cantor(p3,p1);}}(4)为了把三分康托集显示出来,需要在OnDraw()函数中中调用cantor函数,代码如下:voidCCantorView::OnDraw(CDC*pDC){…….CPointp0,p1;p0.x=100;p0.y=50;p1.x=800;p1.y=50;cantor(p0,p1);}(5)程序执行结果1.2Koch曲线和Koch雪花(1)创建应用程序框架,以单文档程序框架为基础,建立工程名称为koch的4、单文档应用程序框架(2)编辑菜单资源在工作区的[ResourceView]标签中,单击Memu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据下表添加编辑菜单资源。菜单标题菜单项标题标识符IDKOCHKoch曲线ID_KOCH_CURVEKoch雪花ID_KOCH_SNOW(3)添加消息处理函数利用ClasssWizard为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CkochView,建立如下的消息映射函数。菜单项ID消息消息处理函数ID_KOCH_CURVECOMMANDOnKochCurveID_K5、OCH_SNOWCOMMANDOnKochSnow(4)右键单击CkochView,选择AddMemberFunction,在弹出的对话框中,FunctionType设为void,FunctionDeclaration设为koch(CPointp0,CPointp1,intiter);单击确定。用同样的方法添加视图类CkochView的成员函数ClearScreen(),类型也为void(5)添加程序结构代码①在kochView.h中类定义之前定义一个存储点信息的如下结构的类,其中x,y设为double型主要为了计算的精度而考虑,保证在计算6、过程中较小的误差。classCPOINT{public:Doublex,y;CPOINT(){}~CPOINT(){}};②在CantorView.cpp文件中相应位置添加如下代码voidCKochView::koch(CPointp0,CPointp1,intiter){CClientDCpDC(this);CPointr0,r1,r2;if(iter==1){pDC.MoveTo(p0.x,p0.y);pDC.LineTo(p1.x,p1.y);return;}if(iter>1){r0.x=p0.x+(p1.x-p0.x)/3;r0.7、y=p0.y+(p1.y-p0.y)/3;r1.x=p0.x+2*(p1.x-p0.x)/3;r1.y=p0.y+2*(p1.y-p0.y)/3;r2.x=(r1.x-r0.x)/2-(r1.y-r0.y)*sqrt(3)/2+r0.x;r2.y=(r1.y-r0.y)/2+(r1.x-r0.x)*sqrt(3)/2+r0.y;koch(p0,r0,iter-1);koch(r1,p1,iter-1);koch(r0,r2,iter-1);koch(r2,r1,iter-1);}}voidCKochView::ClearScreen(){C8、ClientDCdc(this);CRectwindow;GetClientRect(window);dc.SelectStockObject(WHITE_PEN);dc.Sel
3、3.y=p1.y+80;p0.y=p0.y+80;p1.y=p1.y+80;cantor(p0,p2);cantor(p3,p1);}}(4)为了把三分康托集显示出来,需要在OnDraw()函数中中调用cantor函数,代码如下:voidCCantorView::OnDraw(CDC*pDC){…….CPointp0,p1;p0.x=100;p0.y=50;p1.x=800;p1.y=50;cantor(p0,p1);}(5)程序执行结果1.2Koch曲线和Koch雪花(1)创建应用程序框架,以单文档程序框架为基础,建立工程名称为koch的
4、单文档应用程序框架(2)编辑菜单资源在工作区的[ResourceView]标签中,单击Memu项左边“+”,然后双击其子项IDR_MAINFRAME,并根据下表添加编辑菜单资源。菜单标题菜单项标题标识符IDKOCHKoch曲线ID_KOCH_CURVEKoch雪花ID_KOCH_SNOW(3)添加消息处理函数利用ClasssWizard为应用程序添加与菜单项相关的消息处理函数,ClassName栏中选择CkochView,建立如下的消息映射函数。菜单项ID消息消息处理函数ID_KOCH_CURVECOMMANDOnKochCurveID_K
5、OCH_SNOWCOMMANDOnKochSnow(4)右键单击CkochView,选择AddMemberFunction,在弹出的对话框中,FunctionType设为void,FunctionDeclaration设为koch(CPointp0,CPointp1,intiter);单击确定。用同样的方法添加视图类CkochView的成员函数ClearScreen(),类型也为void(5)添加程序结构代码①在kochView.h中类定义之前定义一个存储点信息的如下结构的类,其中x,y设为double型主要为了计算的精度而考虑,保证在计算
6、过程中较小的误差。classCPOINT{public:Doublex,y;CPOINT(){}~CPOINT(){}};②在CantorView.cpp文件中相应位置添加如下代码voidCKochView::koch(CPointp0,CPointp1,intiter){CClientDCpDC(this);CPointr0,r1,r2;if(iter==1){pDC.MoveTo(p0.x,p0.y);pDC.LineTo(p1.x,p1.y);return;}if(iter>1){r0.x=p0.x+(p1.x-p0.x)/3;r0.
7、y=p0.y+(p1.y-p0.y)/3;r1.x=p0.x+2*(p1.x-p0.x)/3;r1.y=p0.y+2*(p1.y-p0.y)/3;r2.x=(r1.x-r0.x)/2-(r1.y-r0.y)*sqrt(3)/2+r0.x;r2.y=(r1.y-r0.y)/2+(r1.x-r0.x)*sqrt(3)/2+r0.y;koch(p0,r0,iter-1);koch(r1,p1,iter-1);koch(r0,r2,iter-1);koch(r2,r1,iter-1);}}voidCKochView::ClearScreen(){C
8、ClientDCdc(this);CRectwindow;GetClientRect(window);dc.SelectStockObject(WHITE_PEN);dc.Sel
此文档下载收益归作者所有