Bresenham算法的基本思想:
该算法的思想是通过各行、各列像素中心构造一组虚拟网络线,按照直线起点到重点的顺序,计算直线与各垂直网格线的交点,然后根据误差项的符号确定该列像素中与此交点最近的像素。
假设每次x+1,y的递增(减)量为0或1,它取决于实际直线与最近光栅网格点的距离,这个距离的最大误差为0.5.
误差项d的初值d0=0,d = d + k,一旦d>=1,就把它减去1,保证d的相对性,且在0,1之间
改进1:令e=d-0.5
e>0,y方向递增1;e<0,y方向不递增;e=0,可任取上下光栅点显示
e初=-0.5,k=dy/dx;每走一步有e=e+k;if(e>0) then e=e-1
改进2:由于算法中只用到误差项的符号,于是可以用e*2*Δx来替换e
e初=-Δx;每走一步有:e=e+2Δy;if(e>0) then e=e-2Δx
算法步骤:
1、输入直线的两端点p0(x0,y0)和p1(x1,y1)
2、计算初始值Δx,Δy,e=-Δx,x=x0,y=y0
3、绘制点(x,y)
4、e更新为e+2Δy,判断e的符号。若e>0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2Δx;否则(x,y)更新为(x+1,y)
5、当直线没有画完时,重复步骤3和4.否则结束
Bresenham算法:
//drawpixel(x, y, color)表示在点(x,y)处绘制color的像素点
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++){
drawpixel(x, y, color);
x += 1;
e += k;
if(e >= 0){
y++;
e = e - 1;
}
}
}
改进后的Bresenham算法:
//drawpixel(x, y, color)表示在点(x,y)处绘制color的像素点
void IntegerBresenhamline(int x0, int y0, int x1, int y1, int color){
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++;
e = e + 2 * dy;
if(e >= 0){
y++;
e = e - 2 * dx;
}
}
}