计算机图形学实验报告--Bresenham直线算法与画圆算法(共5页).doc
精选优质文档-倾情为你奉上实验一名称:基本图形的生成算法要求:(1)掌握DDA生成线段算法 (2)掌握Bresenham生成线段算法 (3)掌握生成圆弧算法1. 代码(1) Bresenham画线算法void CDlgBresenhamLine:OnBresenhamBUTTON2() UpdateData(true);CDC* pDC=m_picture.GetDC(); int xa=m_start_x, ya=m_start_y, xb=m_end_x, yb=m_end_y,c=RGB(0,255,0);int dx=abs(xa-xb),dy=abs(ya-yb); int p=2*dy-dx;int x,y;if(xa>xb)x=xb;y=yb;xb=xa;elsex=xa;y=ya;while(x<xb)x+;if(p<0)p+=2*dy;elsey+;p+=2*(dy-dx);pDC->SetPixel(int)x, (int)y, c);ReleaseDC(pDC);(2) 中点画圆算法void CDMidpointcircleDlg:OncircleBUTTON2() / TODO: Add your control notification handler code hereUpdateData(true);CDC* pDC=m_picture.GetDC(); int xc=m_x, yc=m_y, r=m_r, c=RGB(255,0,0); int d=(5-r*4)/4;int x=0,y=r;while(x<=y)pDC->SetPixel(xc+x,yc+y,c);pDC->SetPixel(xc+x,yc-y,c);pDC->SetPixel(xc-x,yc+y,c);pDC->SetPixel(xc-x,yc-y,c);pDC->SetPixel(xc+y,yc+x,c);pDC->SetPixel(xc+y,yc-x,c);pDC->SetPixel(xc-y,yc+x,c);pDC->SetPixel(xc-y,yc-x,c);if(d<0)d += 2*x+3;elsed += 2*(x-y)+5;y -;x +; ReleaseDC(pDC); 2. 结果截图(1) Bresenham画线(2) 中点画圆3. 算法流程(1) Bresenham画线(2) 中点画圆 输入圆的半径r和圆心坐标(Xc,Yc),先计算以原点为圆心、r为半径的圆周上的点,令初始点为(X0,Y0)=(0,r)。 求初始判别式d,d=1-r。 在每一个Xn的位置,从n=0开始,进行下列检测:如果d<0,则圆心在原点的的下一个点为为(Xn+1,Yn),且d=d+2*Xn+3,;否则,圆的下一个点为(Xn+1,Yn-1),且d=d+2*(Xn-Yn)+5. 确定(Xn+1,Yn+1)乍看情况后家7个八分圆中的对称点位置。 将计算出的每个像素位置(X,Y)平移到圆心位于(Xc,Yc)的圆的轨迹上,即分别沿水平和垂直方向平移Xc和Yc,平移后的坐标值为(X,Y),X=X+Xc, Y=Y+Yc。 重复第至步,直到X>=Y时为止。4. 总结本次实验,让我了解到了一些基本图形生成算法:Bresenham算法、数值微分法、中点法等,各种算法画线和画圆都有各自的步骤和特点,尤其在同时比较时更能突出算法的不同效果。初步了解这些基本算法,为我在以后的学习中打下了基础。专心-专注-专业