Bresenham算法示图
Bresenham算法示图
●(1)当d≥0.5时,取(x+1y+1),且d=d-1; (2)当d<0.5时,取(x+1,y),误差d值不变; 令误差e=d-0.5,则有 (1)e=e+k,并且误差e的初值,e=-0.5 (2)当e20时,取(x+1,y+1),且e=e-1 当e<0时,取(X+1,y),误差e值不变;
⚫ (1) 当d≥0.5时,取(x+1,y+1),且d=d-1; ⚫ (2) 当d<0.5时,取(x+1,y),误差d值不变; ⚫ 令误差 e=d-0.5,则有 ⚫ (1) e=e+k,并且误差e的初值,e = -0.5; ⚫ (2)当e≥0时,取(x+1,y+1),且e=e-1; ⚫ 当e<0时,取(x+1,y),误差e值不变;
程序描述 o Bresenham_ line(x0,yo, x1,y1, color) int x0, yo, x1,y1, color; int x,y,dx, dy, i; float k,e: dxex1-XO; dy=y1-yO; ke=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=y+1;e=e
程序描述 ⚫ Bresenham_line(x0,y0,x1,y1,color) ⚫ int x0,y0,x1,y1,color; ⚫ { ⚫ int x,y,dx,dy, i; ⚫ 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=y+1; e=e-1; ⚫ } ⚫ }
程序改进 °在每次计算e值时得到都是小数,为了 便于硬件计算,取掉小数。由于算法只 需要用到误差项e的符号,所以可以作如 下替换: 设e=2e=2(d-0.5)=2d-1,即e=e’2 误差e的初值e=-1, e=e+k替换为e2=e/2+k,即e=e”+2k 即可
程序改进: ⚫ 在每次计算e值时得到都是小数,为了 便于硬件计算,取掉小数。由于算法只 需要用到误差项e的符号,所以可以作如 下替换: ⚫ 设 e’=2e=2(d-0.5)=2d-1,即e= e’/2 ⚫ 误差 e’的初值 e’= -1, ⚫ e=e+k 替换为 e’/2=e’/2+k, 即e’=e’+2k 即可
算法举例 ●设直线的起点为(0,0),终点为(5, 3),按 Bresenham算法计算并确定个 像素点位置。 计算dx=5,dy=3k=3/5=06,误差e=05 ●x=0y=0
算法举例: ⚫ 设直线的起点为(0,0),终点为(5, 3),按Bresenham 算法计算并确定个 像素点位置。 ⚫ 计算dx=5,dy=3,k=3/5=0.6,误差e=-0.5; ⚫ x=0,y=0