计算机图形学课后题答案 徐长青、许志闻 机械工业出版社
计算机图形学课后题答案
习题解答 第2章
2.如果线段端点坐标值不是整数,采用DDA算法产生的直线和将端点坐标值先取整再用Bresenham算法产生的直线是否完全相同?为什么?能否扩充整数Bresenham算法使之能处理当线段端点坐标值不是整数的情况(比端点坐标先取整数产生的直线更精确)。
如果线段端点坐标值不是整数,DDA算法和Bresenham算法产生的直线不完全相同。DDA算法是在直线附近寻找最靠近直线的象素点。而端点坐标值先取整再用Bresenham算法,因为端点坐标值先取整,与原直线相比,可能会改变直线的斜率。因此两种算法相比,前者比后者更精确。
可以将整数Bresenham算法扩充为实数Bresenham算法。算法中的变量都应采用实数类型,在绘制时再对实数坐标值取整数,这样做比端点坐标先取整数产生的直线更精确,具体算法如下:
void BresenhamLine(double x1, double y1, double x2, double y2) { int x,y ; double dx,dy,p; x=(int)(x1+0.5); y=(int)(y1+0.5); dx=x2-x1; dy=y2-y1; p=2*dy*(x-x1+1)-dx*(2*y-2*y1+1); for(;x<=x2;x++) { SetPixel(x,y); if(p>=0) { y++; p+=2*(dy-dx); } else { p+=2*dy; } } }
3.推广本章第一节给出的产生线段的整数Bresenham算法,去掉0≤m≤1和xl