《计算机图形学--直线的生成算法的实现(共7页).doc》由会员分享,可在线阅读,更多相关《计算机图形学--直线的生成算法的实现(共7页).doc(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上实验二 直线的生成算法的实现班级 08信计2班 学号 59 姓名 分数 一、实验目的和要求1.理解直线生成的基本原理。2.掌握几种常用的直线生成算法。3.利用Visual C+实现直线生成的DDA算法。二、实验内容1.了解直线的生成原理,尤其是Bresenham画线法原理。2.掌握几种基本的直线生成算法:DDA画线法、Bresenham画线法、中点画线法。3.利用Visual C+实现直线生成的DDA算法,在屏幕上任意生成一条直线。三、实验步骤1.直线的生成原理:(1)DDA画线法也称数值微分法,是一种增量算法。是一种基于直线的微分方程来生成直线的方法。(2)中点画线
2、法原理以下均假定所画直线的斜率,如果在方向上的增量为1,则方向上的增量只能在之间。中点画线法的基本原理是:假设在坐标为的各像素点中,与直线最近者已经确定为,用小实心圆表示。那么,下一个与直线最近的像素只能是正右方的,或右上方的,用小空心圆表示。以为和的中点,则的坐标为。又假设是理想直线与垂直线的交点。显然,若在的下方,则离直线近,应取为下一像素点;若在的上方,则离直线近,应取为下一像素点。(3)Bresenham画线法原理直线的中点Bresenham算法的原理:每次在主位移方向上走一步,另一个方向上走不走步取决于中点偏差判别式的值。给定理想直线的起点坐标为P0(x0,y0),终点坐标为P1(x
3、1,y1),则直线的隐函数方程为: (3-1) 构造中点偏差判别式d。 (1) 当d0时 当d0时 2.实现前面所述的各种直线生成算法,包括DDA算法、中点生成算法、Bresenham生成算法等。程序运行后的菜单界面如图2-1所示。图2-1 直线生成图形的程序运行界面首先创建工程名为“基本图形的生成与填充”的单文档应用程序框架,操作步骤如下:(1)创建单文档应用程序框架。启动Visual C+,选择“文件/新建”菜单命令,在弹出的新建对话框中单击“工程”标签;选择.MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成与填充”(也可以使用英文名称),选择所要存放的位置
4、后,单击“确定”按钮,出现Stept1对话框;选择“单个文档”选项,单击“下一步”按钮,在接着的Stept2Stept5中,均可以直接单击“下一步”按钮完成应用程序框架的构建。也可以在Stept1步选择“单文档”(Single document)后,直接单击“完成”按钮完成。(2)编辑菜单资源。在工作区中的Resource View标签中,单击Menu项左边的“+”,然后双击其子项IDRMAINFRAME,弹出编辑主菜单项,根据表1中定义的菜单项资源来编辑菜单,如图2-2所示。图2-2 编辑主菜单项(3)添加消息处理函数。利用类向导(Class Wizard)为应用程序添加与菜单项相关的消息处
5、理函数。右击菜单项标题,选择“建立类向导”,在弹出的MFC ClassWizard窗口中,选择Message Maps标签,在Class Name栏中选择CMyView,根据表2建立消息映射函数,如图2-3所示。MFC ClassWizard会自动完成有关的函数声明。图2-3 添加消息处理函数(4)添加程序代码。在CMyView.cpp文件中相应的位置添加各算法的程序代码,在Visual C+的MFC中绘制图形,一般可以调用一个“CDC”类,从CDC开始,添加代码。添加代码如下:/DDA算法生成直线,起点(x0,y0),终点(x1,y1)。void CMyView:OnDdaline() CD
6、C *pDC=GetDC(); int x0=100,y0=100,x1=300,y1=200,c=RGB(255,0,0);int x,y,i;float dx,dy,k;dx=(float)(x1-x0);dy=(float)(y1-y0);k=dy/dx;x=x0;y=y0;if(abs(k)1)for(;ySetPixel(x,int(y+0.5),c);y=y+k;if(abs(k)=1)for(;ySetPixel(int(x+0.5),y,c);x=x+1/k;ReleaseDC(pDC);/中点算法生成直线void CMyView:OnMidpointline() CDC *p
7、DC=GetDC();int x0=100,y0=100,x1=400,y1=300,c=RGB(0,0,0);float a,b,d1,d2,d,x,y;a=y0-y1;b=x1-x0;d=2*a+b;d1=2*a;d2=2*(a=b);x=x0;y=y0;pDC-SetPixel(x,y,c);while(xx1)if(dSetPixel(x,y,c);ReleaseDC(pDC);/Bresenham算法生成直线void CMyView:OnBresenhamline() CDC *pDC=GetDC();int x0=100,y0=100,x1=500,y1=600,color=RGB
8、(0,0,255);int i,x,y,dx,dy;float k,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;for(i=0;iSetPixel(x,y,color);x+;e+=2*dy;if(e=0) y+;e=e-2*dx;ReleaseDC(pDC);(5)编译连接生成可执行程序,运行该程序。仔细检查上述各个操作步骤,核对以上信息,点击调试按钮,调试程序准确无误后即可完整运行该程序。四、实验结果分析运行该程序后,运行程序后,我们可以得到如图2-1的界面,分别单击菜单中的“直线生成”项的“DDA算法生成直线”、“中点算法生成直线”、“Bresenham算法生成直线”,可以得到相应的直线:DDA算法得到的是红色线段,中点生成算法得到的是黑色线段,Bresenham生成算法得到的是蓝色线段,如图2-4所示。图2-4 直线的生成效果图备注:DDA法就是根据直线的斜率来计算出下一个y值,经取整后以确定下一个像素点,因为在进行取整运算,这就难以避免出现所取像素点片在实际直线某一侧的情况。专心-专注-专业