您好,欢迎访问三七文档
当前位置:首页 > 中学教育 > 初中教育 > 实验1-中点画线和Bresenham画线算法的实现
计算机图形学实验报告实验1使用画线算法,绘制直线段姓名系别班级学号实验日期指导教师实验成绩杜艾莲地信10110081409252011.10.10一.实验目的及要求(1)掌握图形学中常用的三种画线算法:数值微分法、中点画线法和Bresenham画线算法。(2)掌握绘制直线的程序设计方法。(3)掌握使用文件来保存直线段的方法。(4)掌握从文本文件中恢复出直线的方法。二.实验内容使用VC++6.0开发环境,分别实现中点画线算法和Bresenham画线算法,绘制直线(注意,不能使用VC中已有的绘制直线的函数),并以文本文件的形式保存绘制的结果,可以从文本文件中恢复出以前绘制过的直线。三.算法设计与分析Bresenham算法绘制直线的程序(仅包含整数运算)。voidMidBresenhamLine(intx0,inty0,intx1,inty1,intcolor){intdx,dy,d,UpIncre,DownIncre,x,y;if(x0x1){x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;输入P0(X0,Y0)和P1(X1,Y1)计算初始值△x,△yd=△x-2△y,x=X0,y=Y0(x,y)更新为(x+1,y+1),d更新为d+2△x-2△y(x,y)更新为(x+1,y),d更新为d-2△y结束}x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;while(x=x1){putpixel(x,y,color);X++;if(d0){y++;d+=UpIncre;}elsed+=DownIncre;}}四.程序调试及运行结果的自我分析与自我评价//testView.cpp:implementationoftheCTestViewclass#includestdafx.h#includetest.h#includetestDoc.h#includetestView.h#includeiostream//ifstream、ofstream等位于其中#includefstream#includestring//string类型需要#includeDlgInput.h//CDlgInput类的头文件usingnamespacestd;#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif//CTestViewIMPLEMENT_DYNCREATE(CTestView,CView)BEGIN_MESSAGE_MAP(CTestView,CView)//{{AFX_MSG_MAP(CTestView)ON_COMMAND(ID_MENUITEM32771,OnMenuitem32771)ON_COMMAND(ID_MENUBRESENHAMLINE,OnMenubresenhamline)ON_COMMAND(ID_MENUCLEARVIEW,OnMenuclearview)ON_COMMAND(ID_FILE_OPEN,OnFileOpen)ON_COMMAND(ID_FILE_SAVE,OnFileSave)//}}AFX_MSG_MAP//StandardprintingcommandsON_COMMAND(ID_FILE_PRINT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView::OnFilePrintPreview)END_MESSAGE_MAP()//CTestViewconstruction/destructionCTestView::CTestView(){//TODO:addconstructioncodeherem_nFlag=-1;//不是任何绘图类型}CTestView::~CTestView(){}BOOLCTestView::PreCreateWindow(CREATESTRUCT&cs){//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnCView::PreCreateWindow(cs);}//CTestViewdrawingvoidCTestView::OnDraw(CDC*pDC){CTestDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahereif(1==m_nFlag)//中点画线{MidPointLine(m_X0,m_Y0,m_X1,m_Y1,RGB(255,0,0));}elseif(2==m_nFlag)//Bresenham画线{BresenhamLine(m_X0,m_Y0,m_X1,m_Y1,RGB(0,255,0));}}//CTestViewprintingBOOLCTestView::OnPreparePrinting(CPrintInfo*pInfo){//defaultpreparationreturnDoPreparePrinting(pInfo);}voidCTestView::OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addextrainitializationbeforeprinting}voidCTestView::OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addcleanupafterprinting}//CTestViewdiagnostics#ifdef_DEBUGvoidCTestView::AssertValid()const{CView::AssertValid();}voidCTestView::Dump(CDumpContext&dc)const{CView::Dump(dc);}CTestDoc*CTestView::GetDocument()//non-debugversionisinline{ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CTestDoc)));return(CTestDoc*)m_pDocument;}#endif//_DEBUG//CTestViewmessagehandlersvoidCTestView::OnMenuitem32771(){//TODO:Addyourcommandhandlercodeherem_nFlag=1;//中点画线CDlgInputdlg;if(IDOK==dlg.DoModal()){m_X0=dlg.m_nX0;m_Y0=dlg.m_nY0;m_X1=dlg.m_nX1;m_Y1=dlg.m_nY1;RedrawWindow();//重绘窗口}}voidCTestView::OnMenubresenhamline(){//TODO:Addyourcommandhandlercodeherem_nFlag=2;//Bresenham画线CDlgInputdlg;if(IDOK==dlg.DoModal()){m_X0=dlg.m_nX0;m_Y0=dlg.m_nY0;m_X1=dlg.m_nX1;m_Y1=dlg.m_nY1;RedrawWindow();//重绘窗口}}//算法:中点画线//输入:起点(x0,y0),终点(x1,y1);//输入要求x0=x1;voidCTestView::MidPointLine(intx0,inty0,intx1,inty1,intcolor){CDC*pDC=GetDC();inta,b,d0,d1,d2,d3,d4,d5,d,x,y;a=y0-y1;b=x1-x0;//之前的设置已经保证始终有x1=x0d=2*a+b;d0=2*a-b;d1=2*a;d2=2*(a+b);d3=2*b;d4=2*(a-b);d5=a-2*b;x=x0;y=y0;pDC-SetPixel(x,y,color);if(x==x1)//斜率k为无穷大{if(y=y1){while(y=y1){pDC-SetPixel(x,y,color);y++;}}else{while(y=y1){pDC-SetPixel(x,y,color);y--;}}}//if斜率k为无穷大else//斜率k为有限值{//doublek=-a/b;//if(k+11e-6&&k-11e-6||fabs(k-1)1e-6||fabs(k+1)1e-6)//|k|=1(即:-1=k=1),与1e-6比较是浮点数比较方法if(-b=-a&&-a=b)//用浮点数比较在|k|=1.0f时容易出问题,所以直接用整数比较(将斜率k转换为a与b的比较;之前的设置已经保证b为正数){if(y=y1){while(xx1){if(d0){x++;y++;d+=d2;}else{x++;d+=d1;}pDC-SetPixel(x,y,color);}}else{while(xx1){if(d00){x++;d0+=d1;}else{x++;y--;d0+=d4;}pDC-SetPixel(x,y,color);}}}//if(|k|=1)else//|k|1{if(y=y1){while(xx1){if(d0){y++;d+=d3;}else{y++;x++;d+=d2;}pDC-SetPixel(x,y,color);}}else{while(xx1){if(d50){x++;y--;d5+=d4;}else{y--;d5+=-2*b;}pDC-SetPixel(x,y,color);}}}//else(|k|1)}//else斜率k为有限值ReleaseDC(pDC);}//算法:Bresenham画线//输入:起点(x0,y0),终点(x1,y1);//输入要求x0=x1;voidCTestView::BresenhamLine(intx0,inty0,intx1,inty1,intcolor){CDC*pDC=GetDC();intx,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x=x1){pDC-SetPixel(x,y,color);x++;e=e+2*dy;if(e0){y++;e=e-2*dx;}}}voidCTestView::OnMenuclearview(){//TODO:Addyourcommandhandlercodeherem_X0=0;m_Y0=0;m_X1=0;m_Y1=0;RedrawWindow();//重绘窗口}//打开过去保存的文件,该文件包含直线的端点坐标voidCTestView::OnFileOpen(){//TODO:在此添加命令处理程序代码if(m_nFlag!=1&&m_nFlag!=2){MessageBox(请先在菜单中选择绘制直线的方法!,提示,MB_ICONWARNING);return;}CFileDialogdlgFile(TRUE,_T(txt),_T(),OFN_FILEMUSTEXIST|OFN_HIDEREADONLY,_T(线段端点坐标文件(*.txt)|*.txt||),this);if(IDOK==dlgFile.DoModal()){CStringfileName=dlgFile.GetFileName();ifst
本文标题:实验1-中点画线和Bresenham画线算法的实现
链接地址:https://www.777doc.com/doc-5400823 .html