Bresenham算法 图示 设直线方程为+有片+ 其中k=dy/dx。假设x列的象素已经确定为x1 其行坐标为y:。那么下一个象素的列坐标为x;+1 而行坐标要么不变为y;,要么递增1为y;+1。是 否增1取决于如图所示误差项d的值。因为直线的 起始点在象素中心,所以误差项d的初值dO=0。 Ⅹ下标每增加1,d的值相应递增直线的斜率值k, 即d=d+k。一旦d≥1,就把它减去1,这样保证 d在0、1之间。当d≥0.5时,直线与x;+1列垂直 网格交点最接近于当前象素(x1,y1)的右上方 象素(x1+1,y1+1);而当d0.5时,更接近于 右方象素(x;+1,y;)。为方便计算,令e=d 0.5,e的初值为-0.5,增量为k。当e≥O时,取 当前象素(x;,y1)的右上方象素(x1+1,y;+ 1);而当e<0时,更接近于右方象素(x;+1
Bresenham算法 • 图示 设直线方程为 , 其中k=dy/dx。 假设x列的象素已经确定为xi, 其行坐标为yi。那么下一个象素的列坐标为xi+1, 而行坐标要么不变为yi,要么递增1为yi+1。是 否增1取决于如图所示误差项d的值。因为直线的 起始点在象素中心,所以误差项d的初值d0=0。 X下标每增加1,d的值相应递增直线的斜率值k, 即d=d+k。一旦d≥1,就把它减去1,这样保证 d在0、1之间。当d≥0.5时,直线与xi+1列垂直 网格交点最接近于当前象素(xi,yi)的右上方 象素(xi+1,yi+1);而当d<0.5时,更接近于 右方象素(xi+1,yi)。为方便计算,令e=d- 0.5,e的初值为-0.5,增量为k。当e≥0时,取 当前象素(xi,yi)的右上方象素(xi+1,yi+ 1);而当e<0时,更接近于右方象素(xi+1, yi)
Bresenham算法 Bresenham画线算法程序 void Bresenhamline (int xo, int yo, int xI, int y,, int color) i int x, y, dx, dy; float k.e for(i=0; K=dx; 1++) dx =X1-xo i Putpixel(x, y, color) d y1- yo X=X+1 kdy/dx e=e+k e=-0.5: if(e>=0) {y++,e=e-1i}
Bresenham算法 Bresenham画线算法程序: void Bresenhamline (int x0 ,int y0 ,int x1 , int y1 ,int color) { int x, y, dx, dy; float k, e; dx = x1 -x0 ; dy = y1 - y0 ; k=dy/dx; e=-0.5; x=x0 ; y=y0 ; for (i=0; i<=dx; i++) { Putpixel (x, y, color); x=x+1; e=e+k; if (e>= 0) { y++, e=e-1;} } }
Bresenham算法 举例:用 Bresenham方法扫描转换连接两点PO(0,0) 和P1(5,2)的直线段。 Eye 00-0.5 10-0.10.3-1 21-0.7 31-0.30.1-1 42-0.9 52-0.5 012345
Bresenham算法 举例:用Bresenham方法扫描转换连接两点P0(0,0) 和P1(5,2)的直线段。 x y e 0 0 -0.5 1 0 -0.1 0.3-1 2 1 -0.7 3 1 -0.3 0.1-1 4 2 -0.9 5 2 -0.5
Bresenham算法 分析:上述 bresenham算法在计算直线斜率与误差项时用到小数与除法 可以改用整数以避免除法。由于算法中只用到误差项的符号,因此可 作如下替换:e=e*2dx,改进的 Bresenham画线算法程序: roid Inter Bresenhamline cyo (int xo, int yo nt x, for(i=0; 1<=dx; 1++) int color) Putpixel(x, y, color) i dx=X + y=y1-yo e=e+2*dy if(e>=0){y++;e=e-2*dx
Bresenham算法 分析:上述bresenham算法在计算直线斜率与误差项时用到小数与除法。 可以改用整数以避免除法。由于算法中只用到误差项的符号,因此可 作如下替换:e=e*2dx,改进的Bresenham画线算法程序: void InterBresenhamline (int x0 ,int y0 ,int x1 , int y1 ,int color) { dx = x1 -x0 ; dy = y1 - y0 ; e=-dx; x=x0 ; y=y0 ; for (i=0; i<= dx; i++) {Putpixel (x, y, color); x++; e=e+2*dy; if (e>= 0) { y++; e=e-2*dx;} } }
44圆与椭圆的扫描转换 X2+Y2=R2 (X/a)2+(Y/b)2=R2
4.4 圆与椭圆的扫描转换 X2+Y2=R2 (X/a)2+(Y/b)2=R2