资源描述:
《计算机图形学Bresenham算法.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、地理与生物信息学院2010/2011学年第二学期实验报告课程名称:计算机图形学实验名称:Bresenham直线扫描算法的实现班级学号B学生姓名郭超伟指导教师曹正林日期:2011年4月一、实验题目:Bresenham直线扫描算法的实现二、实验要求:学习VisualC++6.0集成编程环境的使用、图形设备接口和常用图形程序设计、鼠标编程以及菜单设计等基础知识,从而掌握利用VisualC++进行图形程序设计的方法以及简单的图形画法,并编程实现Bresenham直线扫描转换程序,得出相应的输出图形。三、实验内容:1.学习VisualC++6.0集成编成环境的使用;2
2、.掌握VisualC++6.0图形设备接口和常用图形程序设计、菜单设计等方法;3.编程实现Bresenham直线扫描转换程序,得出相应的输出图形;四、实验过程:1.算法的基本描述//假设该线段位于第一象限内且斜率大于0小于1,设起点为(x1,y1),终点为(x2,y2).//根据对称性,可推导至全象限内的线段.1.画起点(x1,y1).2.准备画下个点。x坐标增1,判断如果达到终点,则完成。否则,由图中可知,下个要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点.2.1.如果线段ax+by+c=0与x=x1+1的交点的y坐标大于M点的y坐标的话,下个点
3、为U(x1+1,y1+1)2.2.否则,下个点为B(x1+1,y1)3.画点(U或者B).4.跳回第2步.5.结束图1直线实现原理这里需要细化的是怎么判断下个要画的点为当前点的右邻接点还是当前点的右上邻接点2.算法的源程序voidCBView::OnMenuline(){//TODO:AddyourcommandhandlercodehereInputDlgdlg;if(dlg.DoModal()==IDOK){x1=dlg.m_x1;y1=dlg.m_y1;x2=dlg.m_x2;y2=dlg.m_y2;}AfxGetMainWnd()->SetWindo
4、wText("Bresenham算法");RedrawWindow();Bresenham();}voidCBView::Brensenham(){CClientDCdc(this);CRectRect;//定义矩形对象GetClientRect(&Rect);//获得当前窗口的客户区大小dc.SetMapMode(MM_ANISOTROPIC);//设置MM_ANISOTROPIC映射模式dc.SetWindowExt(Rect.Width(),Rect.Height());//设置窗口范围dc.SetViewportExt(Rect.Width(),-R
5、ect.Height());//设置视区范围dc.SetViewportOrg(Rect.Width()/2,Rect.Height()/2);//设置视口原点dc.MoveTo(-Rect.Width(),0);dc.LineTo(Rect.Width(),0);dc.MoveTo(0,-Rect.Height()/2);dc.LineTo(0,Rect.Height()/2);COLORREFrgb=RGB(0,255,0);//定义直线颜色doublex,y;doubled,k;k=(y2-y1)/(x2-x1);if(0<=k&&k<=1)//直线斜
6、率[0,1]时{if(x1>x2){doubletx=x1;doublety=y1;x1=x2;y1=y2;x2=tx;y2=ty;}x=x1;y=y1;d=0.5-k;for(x=x1;x<=x2;x++){dc.SetPixel(ROUND(x),ROUND(y),rgb);if(d<0){y++;d+=1-k;}elsed-=k;}}if(k>1)//直线斜率k>1时{if(y1>y2){doubletx=x1;doublety=y1;x1=x2;y1=y2;x2=tx;y2=ty;}x=x1;y=y1;d=1-0.5*k;for(y=y1;y<=y2
7、;y++){dc.SetPixel(ROUND(x),ROUND(y),rgb);if(d>=0){x++;d+=1-k;}elsed+=1;}}if(k<-1)//直线斜率k<-1时{if(y1y2;y--){dc.SetPixel(ROUND(x),ROUND(y),rgb);if(d<0){x++;d-=1+k;}elsed-=1;}}if(-1<=k&&k<0)//直线斜率[-1,
8、0]时{if(x1>x2){doubletx=x1;