Bresenham算法类似于中点法,由误差项符号决定下一个像素取右边点还是右上点。
算法原理:
设直线方程为 y = kx +b, 则有 yi+1= yi + k (xi+1 – xi) = yi + k .
设x列的坐标为(xi, yi), 那么下一个像素的列坐标为xi+1,
而行坐标要么仍为yi,要么递增1为yi+1。
是否增1取决于误差项d的值
d的初值为0.
x下标每增加1,d的值相应增加k.
当d≥0.5时,直线与xi+1列的交点更接近于
像素(xi +1, yi +1),即该像素在y方向递增1.
同时作为下一次计算的基点,因此d值减1.
当d<0.5时,交点更接近于像素(xi +1, yi)。
为方便计算,令e = d - 0.5, e的初值为-0.5. 增量为k.
void Bresenhamline (int x0,int y0, int x1, int y1, int color)
/**//* 起点(x0, y0) 终点(x1, y1)*/
...{ 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++)
...{ drawpixel (x, y, color);
x=x+1,e=e+k;
if (e³0)
...{ y++, e=e-1;}
}
}
为避免小数与除法,可以改用整数: 做如下替换 e1 = 2 * e * dx
Bresenham画线法程序
void IntegerBresenhamline (int x0,int y0, int x1, int y1, int color)
/**//* 起点(x0, y0) 终点(x1, y1)*/
...{ int x, y, dx, dy, e;
dx = x1-x0, dy = y1- y0, e = -dx;
x=x0, y=y0;
for (i=0; i <= dx; i++) ...{
drawpixel (x, y, color);
x=x++,e=e+2*dy;
if (e >= 0 ) ...{ y++, e = e - 2*dx; }
}
算法原理:
设直线方程为 y = kx +b, 则有 yi+1= yi + k (xi+1 – xi) = yi + k .
设x列的坐标为(xi, yi), 那么下一个像素的列坐标为xi+1,
而行坐标要么仍为yi,要么递增1为yi+1。
是否增1取决于误差项d的值
d的初值为0.
x下标每增加1,d的值相应增加k.
当d≥0.5时,直线与xi+1列的交点更接近于
像素(xi +1, yi +1),即该像素在y方向递增1.
同时作为下一次计算的基点,因此d值减1.
当d<0.5时,交点更接近于像素(xi +1, yi)。
为方便计算,令e = d - 0.5, e的初值为-0.5. 增量为k.
void Bresenhamline (int x0,int y0, int x1, int y1, int color)
/**//* 起点(x0, y0) 终点(x1, y1)*/
...{ 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++)
...{ drawpixel (x, y, color);
x=x+1,e=e+k;
if (e³0)
...{ y++, e=e-1;}
}
}
为避免小数与除法,可以改用整数: 做如下替换 e1 = 2 * e * dx
Bresenham画线法程序
void IntegerBresenhamline (int x0,int y0, int x1, int y1, int color)
/**//* 起点(x0, y0) 终点(x1, y1)*/
...{ int x, y, dx, dy, e;
dx = x1-x0, dy = y1- y0, e = -dx;
x=x0, y=y0;
for (i=0; i <= dx; i++) ...{
drawpixel (x, y, color);
x=x++,e=e+2*dy;
if (e >= 0 ) ...{ y++, e = e - 2*dx; }
}