Bresenham 是一个快速画直线的算法。在现实中,我们可以根据直线方程 y = k x + b y=kx+b y=kx+b 画出任意直线,但在计算机中却稍有不同。由于计算机屏幕是由很多栅格(像素点)组成,所以直线在放大后会变成这个样子:
所以如何画出这样一条直线就成了问题。而 Bresenham 算法就可以快速解决这个问题。
设线段端点为
(
x
1
,
y
1
)
(x_1,y_1)
(x1,y1),
(
x
2
,
y
2
)
(x_2,y_2)
(x2,y2),
Δ
x
,
Δ
y
\Delta x,\Delta y
Δx,Δy 为偏移量,直线方程为
f
(
x
)
=
k
x
+
b
f(x)=kx+b
f(x)=kx+b。则有:
k
=
y
2
−
y
1
x
2
−
x
1
=
Δ
y
Δ
x
k=\frac{y_2-y_1}{x_2-x_1}=\frac{\Delta y}{\Delta x}
k=x2−x1y2−y1=ΔxΔy
假设已经确定了直线上某个点正好在像素 P i ( x i , y i ) P_i(x_i,y_i) Pi(xi,yi),我们要确定下一个像素 P i + 1 P_{i+1} Pi+1 是 ( x i + 1 , y i ) (x_i+1,y_i) (xi+1,yi) 还是 ( x i + 1 , y i + 1 ) (x_i+1,y_i+1) (xi+1,yi+1)。此时的情况如下:
可以算出:
d
1
=
f
(
x
i
+
1
)
−
y
i
d
2
=
(
y
i
+
1
)
−
f
(
x
i
+
1
)
d
1
−
d
2
=
2
k
(
x
i
+
1
)
+
2
b
−
2
y
i
−
1
我们可以把 g ( x i ) = d 1 − d 2 g(x_i)=d_1-d_2 g(xi)=d1−d2 作为决策函数,用来判断下一个像素点的坐标,则有:
y
i
+
1
=
{
y
i
g
(
x
i
)
≤
0
y
i
+
1
g
(
x
i
)
>
0
y_{i+1}=