12020年4月19日计算机图形学课程设计实验报告文档仅供参考,不当之处,请联系改正。22020年4月19日《计算机图形学》实验报告班级计算机科学与技术姓名学号年6月2日文档仅供参考,不当之处,请联系改正。02020年4月19日实验一基本图形生成算法一、实验目的:1、掌握中点Bresenham绘制直线的原理;2、设计中点Bresenham算法;3、掌握八分法中点Bresenham算法绘制圆的原理;4、设计八分法绘制圆的中点Bresenham算法;5、掌握绘制1/4椭圆弧的上半部分和下半部分的中点Bresenham算法原理;6、掌握下半部分椭圆偏差判别式的初始值计算方法;7、设计顺时针四分法绘制椭圆的中点Bresenham算法。二、实验过程:1、实验描述实验1:使用中点Bresenham算法绘制斜率为0=k=1的直线。实验2:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的圆。实验3:使用中点Bresenham算法绘制圆心位于屏幕客户区中心的椭圆。2、实验过程1)用MFC(exe)建立一个单文档工程;2)编写对话框,生成相应对象,设置相应变量;文档仅供参考,不当之处,请联系改正。12020年4月19日3)在类CLineView中声明相应函数,并在相关的cpp文件中实现;4)在OnDraw()函数里调用函数实现绘制直线、圆、椭圆;5)运行程序,输入相应值,绘制出图形。三、源代码实验1:直线中点Bresenham算法1.//cline.cpp:implementationfile//clinedialogcline::cline(CWnd*pParent/*=NULL*/):CDialog(cline::IDD,pParent){//{{AFX_DATA_INIT(cline)m_x0=0;m_y0=0;m_x1=0;m_y1=0;//}}AFX_DATA_INIT}voidcline::DoDataExchange(CDataExchange*pDX)文档仅供参考,不当之处,请联系改正。22020年4月19日{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(cline)DDX_Text(pDX,IDC_x0,m_x0);DDX_Text(pDX,IDC_y0,m_y0);DDX_Text(pDX,IDC_x1,m_x1);DDX_Text(pDX,IDC_y1,m_y1);//}}AFX_DATA_MAP}BEGIN_MESSAGE_MAP(cline,CDialog)//{{AFX_MSG_MAP(cline)//}}AFX_MSG_MAPEND_MESSAGE_MAP()2、//LineView.hclassCLineView:publicCView{public:CLineDoc*GetDocument();..........文档仅供参考,不当之处,请联系改正。32020年4月19日voidMbline(double,double,double,double);//直线中点Bresenham函数.......}3、//Line.cpp//*******************直线中点Bresenham函数*********************/voidCLineView::Mbline(doublex0,doubley0,doublex1,doubley1){CClientDCdc(this);COLORREFrgb=RGB(0,0,255);//定义直线颜色为蓝色doublex,y,d,k;x=x0;y=y0;k=(y1-y0)/(x1-x0);d=0.5-k;for(x=x0;x=x1;x++){dc.SetPixel((int)x,(int)y,rgb);if(d0){y++;d+=1-k;}文档仅供参考,不当之处,请联系改正。42020年4月19日elsed-=k;}}4、//LineView.cppvoidCLineView::OnDraw(CDC*pDC){CLineDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahereclinea;a.DoModal();//初始化CLineView::Mbline(a.m_x0,a.m_y0,a.m_x1,a.m_y1);}实验2:圆中点Bresenham算法1、//cricle.cpp//CcricledialogCcricle::Ccricle(CWnd*pParent/*=NULL*/):CDialog(Ccricle::IDD,pParent)文档仅供参考,不当之处,请联系改正。52020年4月19日{//{{AFX_DATA_INIT(Ccricle)m_r=0;//}}AFX_DATA_INIT}voidCcricle::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(Ccricle)DDX_Text(pDX,r_EDIT,m_r);//}}AFX_DATA_MAP}2、//CcircleView.hclassCCcircleView:publicCView{.......public:CCcircleDoc*GetDocument();voidCirclePoint(double,double);//八分法画圆函数voidMbcircle(double);//圆中点Bresenham函数文档仅供参考,不当之处,请联系改正。62020年4月19日........}3、//CcircleView.cppvoidCCcircleView::OnDraw(CDC*pDC){CCcircleDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahereCcricler;r.DoModal();CCcircleView::Mbcircle(r.m_r);//画圆}4、//CcircleView.cpp//*******************八分法画圆*************************************/voidCCcircleView::CirclePoint(doublex,doubley){CClientDCdc(this);COLORREFrgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);文档仅供参考,不当之处,请联系改正。72020年4月19日dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);dc.SetPixel((int)(300+y),(int)(300+x),rgb);dc.SetPixel((int)(300-y),(int)(300+x),rgb);dc.SetPixel((int)(300+y),(int)(300-x),rgb);dc.SetPixel((int)(300-y),(int)(300-x),rgb);}//**************************圆中点Bresenham函数*********************/voidCCcircleView::Mbcircle(doubler){doublex,y,d;COLORREFrgb=RGB(0,0,255);d=1.25-r;x=0;y=r;for(x=0;xy;x++){CirclePoint(x,y);//调用八分法画圆子函数if(d0)d+=2*x+3;文档仅供参考,不当之处,请联系改正。82020年4月19日else{d+=2*(x-y)+5;y--;}}}实验3:椭圆中点Bresenham算法1、//ellipse1.cpp//CellipsedialogCellipse::Cellipse(CWnd*pParent/*=NULL*/):CDialog(Cellipse::IDD,pParent){//{{AFX_DATA_INIT(Cellipse)m_a=0;m_b=0;//}}AFX_DATA_INIT}voidCellipse::DoDataExchange(CDataExchange*pDX){CDialog::DoDataExchange(pDX);文档仅供参考,不当之处,请联系改正。92020年4月19日//{{AFX_DATA_MAP(Cellipse)DDX_Text(pDX,IDC_EDIT1,m_a);DDX_Text(pDX,IDC_EDIT2,m_b);//}}AFX_DATA_MAP}2、//EllipseView.hclassCEllipseView:publicCView{......................public:CEllipseDoc*GetDocument();voidEllipsePoint(double,double);//四分法画椭圆voidMbellipse(doublea,doubleb);//椭圆中点Bresenham函数..................}3、//Ellipse.cpp//*****************四分法画椭圆********************************/voidCEllipseView::EllipsePoint(doublex,doubley)文档仅供参考,不当之处,请联系改正。102020年4月19日{CClientDCdc(this);COLORREFrgb=RGB(0,0,255);dc.SetPixel((int)(300+x),(int)(300+y),rgb);dc.SetPixel((int)(300-x),(int)(300+y),rgb);dc.SetPixel((int)(300+x),(int)(300-y),rgb);dc.SetPixel((int)(300-x),(int)(300-y),rgb);}//************************椭圆中点Bresenham函数*********************/voidCEllipseView::Mbellipse(doublea,doubleb){doublex,y,d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.25);EllipsePoint(x,y);while(b*b*(x+1)a*a*(y-0.5))//椭圆AC弧段{if(d10)d1+=b*b*(2*x+3);else文档仅供参考,不当之处,请联系改正。112020年4月19日{d1+=b*b*(2*x+3)+a*a*(-2*y+2);y--;}x++;EllipsePoint(x,y);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;//椭圆CB弧段while(y0){if(d20){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++;}elsed2+=a*a*(-2*y+3);y--;EllipsePoint(x,y);}}文档仅供参考,不当之处,请联系改正。122020年4月19日4、//EllipseView.cppvoidCEllipseView::OnDraw(CDC*pDC){CEllipseDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefor