课程名称计算机图形学实验名称DDA、Bresenham、Midpoint算法画直线南华大学计算机科学与技术学院实验报告一、实验目的及要求(1)理解窗口到视区的变换(2)理解MFC创建工程实现动画的原理(3)学习MFC类库的概念与结构(4)学习使用VC++编写Win32应用的方法(单文档,多文档,对话框)(5)学习使用MFC的图形编程软件环境:MicrosoftstudiovisualC++6.0MFC硬件:计算机二、实验内容(1)添加代码实现DDA算法画直线(2)添加代码实现Bresenham算法画直线(3)添加代码实现Midpointline画直线(4)添加代码实现画圆三、实验步骤选择工作环境添加工程名南华大学计算机科学与技术学院实验报告选择程序类型前几步省略全选默认值选择resource-Menu南华大学计算机科学与技术学院实验报告添加不同函数画直线和圆为每个函数建立类向导在fileview中打开sourcefilesview.cpp输入各函数代码并编译运行无误南华大学计算机科学与技术学院实验报告四、实验源码//直线和圆View.cpp:implementationoftheCMyViewclass//#includestdafx.h#include直线和圆.h#include直线和圆Doc.h#include直线和圆View.h#ifdef_DEBUG#definenewDEBUG_NEW#undefTHIS_FILEstaticcharTHIS_FILE[]=__FILE__;#endif///////////////////////////////////////////////////////////////////////////////CMyViewIMPLEMENT_DYNCREATE(CMyView,CView)BEGIN_MESSAGE_MAP(CMyView,CView)//{{AFX_MSG_MAP(CMyView)ON_COMMAND(ID_DDALINE,OnDdaline)ON_COMMAND(ID_MIDPOINTLINE,OnMidpointline)ON_COMMAND(ID_BRESENHAMLINE,OnBresenhamline)ON_COMMAND(ID_MIDPOINTCIRCLE,OnMidpointcircle)//}}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()///////////////////////////////////////////////////////////////////////////////CMyViewconstruction/destructionCMyView::CMyView(){//TODO:addconstructioncodehere}CMyView::~CMyView(){}BOOLCMyView::PreCreateWindow(CREATESTRUCT&cs){//TODO:ModifytheWindowclassorstylesherebymodifying//theCREATESTRUCTcsreturnCView::PreCreateWindow(cs);}///////////////////////////////////////////////////////////////////////////////CMyViewdrawingvoidCirclePoints(intx,inty,intcolor,CDC*pDC)南华大学计算机科学与技术学院实验报告{pDC-SetPixel(x,y,color);pDC-SetPixel(y,x,color);pDC-SetPixel(-x,y,color);pDC-SetPixel(y,-x,color);pDC-SetPixel(x,-y,color);pDC-SetPixel(-y,x,color);pDC-SetPixel(-x,-y,color);pDC-SetPixel(-y,-x,color);}voidMidpointcircle(intr,intcolor,CDC*pDC){intx,y;floatd;x=0;y=r;d=1.25-r;CirclePoints(x,y,color,pDC);pDC-SetViewportOrg(200,100);while(x=y){if(d0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}x++;CirclePoints(x,y,color,pDC);}}voidDDA(intx0,inty0,intx1,inty1,intcolor,CDC*pDC){intx;floatdx,dy,y,k;dx=x1-x0;dy=y1=y0;k=dy/dx;y=y0;for(x=x0;x=x1;x++){pDC-SetPixel(x,int(y+0.5),color);y=y+k;}}voidBresenhamline(intx0,inty0,intx1,inty1,intcolor,CDC*pDC){intx,y,dx,dy;floatk,e;dx=x1-x0;dy=y1-y0;k=dy/dx;e=-0.5;x=x0;y=y0;for(inti=0;i=dx;i++){pDC-SetPixel(x,y,color);x=x+1;e=e+k;if(e=0){y++;e=e-1;}}}voidMidpointline(intx0,inty0,intx1,inty1,intcolor,CDC*pDC){inta,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,color);while(xx1){if(d0){x++;y++;d+=d2;}else{x++;d+=d1;}pDC-SetPixel(x,y,color);}}voidCMyView::OnDraw(CDC*pDC){CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);Midpointcircle(100,RGB(0,168,168),pDC);DDA(0,0,250,300,RGB(255,0,255),pDC);Midpointline(0,0,500,200,RGB(255,255,0),pDC);Bresenhamline(0,0,150,600,RGB(168,200,168),pDC);//TODO:adddrawcodefornativedatahere}///////////////////////////////////////////////////////////////////////////////CMyViewprintingBOOLCMyView::OnPreparePrinting(CPrintInfo*pInfo){//defaultpreparationreturnDoPreparePrinting(pInfo);}voidCMyView::OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addextrainitializationbeforeprinting}voidCMyView::OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/){//TODO:addcleanupafterprinting}///////////////////////////////////////////////////////////////////////////////CMyViewdiagnostics#ifdef_DEBUGvoidCMyView::AssertValid()const{CView::AssertValid();}voidCMyView::Dump(CDumpContext&dc)const{CView::Dump(dc);}CMyDoc*CMyView::GetDocument()//non-debugversionisinline{ASSERT(m_pDocument-IsKindOf(RUNTIME_CLASS(CMyDoc)));return(CMyDoc*)m_pDocument;}#endif//_DEBUG///////////////////////////////////////////////////////////////////////////////CMyViewmessagehandlersvoidCMyView::OnDdaline(){南华大学计算机科学与技术学院实验报告//TODO:Addyourcommandhandlercodehere}voidCMyView::OnMidpointline(){//TODO:Addyourcommandhandlercodehere}voidCMyView::OnBresenhamline(){//TODO:Addyourcommandhandlercodehere}voidCMyView::OnMidpointcircle(){//TODO:Addyourcommandhandlercodehere}五.实验结果六.实验总结分析通过做这个实验学会了使用这个软件,也了解到指针的用法,在做之初由于对指针用法的不熟悉,所以遇到很多问题,从提示中弹出的CDC类,通过对它的学习,我将源码中的drawpixel改写成调用CDC类的pDC指针的用法,再插入pDC-SetViewportOrg(200,100);实现了圆心的移动,实现了对直线的绘制,现在对它的操作已基本掌握了