您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 计算机图形学实验报告--直线的画法(DDA-Bresenham算法)
华北水利水电学院计算机图形学实验报告题目:直线的生成算法姓名:万婷婷学号:200911902专业:计算机科学与技术院系:信息工程学院一、实验目的学会用DDA法,中点法,Bresenham法这三种思想画直线,同时,对画直线的操作有一定的了解。二、实验原理及内容1.DDA法的基本思想如下:已知过端点P0(x0,y0),P1(x1,y1)的直线段L:y=kx+b,直线斜率为k=(y1-y0)/x1-x0,从x的左端点x0开始,向x右端点步进。步长=1(个象素),计算相应的y坐标y=kx+b;取象素点(x,round(y))作为当前点的坐标。3.Bresenham法的基本思想如下:过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列象素中与此交点最近的象素。设直线方程为:其中k=dy/dx。因为直线的起始点在象素中心,所以误差项d的初值d0=0。X下标每增加1,d的值相应递增直线的斜率值k,即d=d+k。一旦d≥1,就把它减去1,这样保证d在0、1之间。当d≥0.5时,最接近于当前象素的右上方象素()而当d0.5时,更接近于右方象素()。为方便计算,令e=d-0.5,e的初值为-0.5,增量为k。当e≥0时,取当前象素(xi,yi)的右上方象素();而当e0时,更接近于右方象素()。可以改用整数以避免除法。4.两方法的程序编写及运行结果截图如下:voidCHTView::OnDda()P=(xp,yp)QP2P1ddddkyxxkyyiiiii)(1111,iiyxiiyx,111,iiyxiiyx,1{CClientDCdc(this);intx0,y0,x1,y1;floatx,y;doublek;x0=10;y0=5;x1=100;y1=200;k=(y1-y0)*1.0/(x1-x0);y=y0;for(x=x0;xx1;x++){dc.SetPixel(int(x),int(y+0.5),RGB(255,0,0));y+=k;}}voidCHTView::OnBhl(){CClientDCdc(this);intx0=10,y0=5,x1=300,y1=200,x=x0,y=y0;doublee=-0.5;intdx=x1-x0;intdy=y1-y0;doublek=dy*1.0/dx;for(inti=0;i=dx;i++){dc.SetPixel(int(x),int(y),RGB(0,0,255));x=x+1;e=e+k;if(e=0){y++;e=e-1;}}}}voidCMyView::OnAddline(){CDC*pDC=GetDC();//获得设备指针intx0=100,y0=100,x1=300,y1=300;intc=RGB(255,0,0);DDA_line(x0,y0,x1,y1,c);intxa=200,ya=100,xb=350,yb=250;Bresenham_line(xa,ya,xb,yb,c);intxc=100,yc=200,xd=300,yd=400;pDC-MoveTo(xc,yc);pDC-LineTo(xd,yd);ReleaseDC(pDC);}实验总结1.工程文件的建立过程具体为:新建-MFCAppWizard[exe]-输入工程名-确定工程所放位置-确定-选择单文档(也可选用其它文档)-完成-确定即可,接下来对工程文件相关属性进行设置,点击ResourceView-.resource-Menu-双击其下选项打开程序编辑页面-对属性进行设置(主要是标明,ID等选项)-建立类向导-AddFunction,这样过程大致完成。2.DDA算法采用点斜式,中点法采用隐式表示,中点法可以有整数算法,Bresenham算法也是每个象素,需一个整数算法,其优点是可以用于其他二次曲线。一、二、三、
本文标题:计算机图形学实验报告--直线的画法(DDA-Bresenham算法)
链接地址:https://www.777doc.com/doc-1516732 .html