中点画线算法
一、原理
已知直线的一般式方程:
F(x,y)=0, 即
Ax+By+C=0
其中:
-
A=−(Δy)
-
B=(Δx)
-
C=−B(Δx)
如图:
代入m,当
xm,ym取不同值时,函数
F(xm,ym)的取值可以分三种情况,
-
F(xm,ym)=0,m点在直线上
-
F(xm,ym)<0,m点在直线下方
-
F(xm,ym)>0,m点在直线上方
二、推导
-
以
0≤∣k∣≤1来讨论:
如图:
可以看出每次在x方向上加1,y方向上加1或不变需要判断。
-
通过仔细观察,发现:
-
利用中点画线的基本原理
将M带入代入理想直线方程,可得
F(xm,ym)=Axm+Bym+C
令
di=F(xm,ym)
则有:
di=F(xi+1,yi+0.5)=A(xi+1)+B(yi+0.5)+C
有三种情况:
- 当d = 0 时: M在直线上,选
pd或
pu均可;
- 当d > 0 时: M在Q上方,应取
pd;
- 当d < 0 时: M在Q下方,应取
pu。
d的值决定了y的值:
di=A(xi+1)+B(yi+0.5)+C
yi+1={yi+1,yi,(di<0)(di≥0)
三、优化
-
分析计算量
为了求出d值,需要两个乘法,四个加法,且有浮点数运算。
-
提高运算效率
因为d是x,y的线性函数,采用增量计算是可行的。
di+1=di+增量
-
计算增量
-
计算
d0
d0=F(xM0,yM0)
=F(xi,yi+0.5)
=A(xi+1)+B(yi+0.5)+C
-
计算
d1
如图:
d1=F(xM1,yM1)
=F(xi+2,yi+1.5)
=A(xi+2)+B(yi+1.5)+C
=A(xi+1)+B(yi+0.5)+C+A+B
=d0+A+B
-
计算
d2
如图:
d2=F(xM2,yM2)
=F(xi+2,yi+0.5)
=A(xi+2)+B(yi+0.5)+C
=A(xi+1)+B(yi+0.5)+C+A
=d0+A
-
计算d的初始值
d0
因为直线的第一个像素
P0(x0,y0)在直线上,即
A(x0)+B(y0)+C=0,因此相应的d的初始值计算如下:
d0=F(x0,y0+0.5)
=A(x0+1)+B(y0+0.5)+C
=A(x0)+B(y0)+C+A+0.5B
=A+0.5B
-
综上可得:
d0=A+0.5B
di+1={di+A+B,di+A,(di<0)(di≥0)
至此,中点算法至少可以和DDA算法一样好。
-
摆脱浮点运算
用2d代替d来摆脱浮点运算,写出仅包含整数运算的算法。这样,中点生成直线的算法提高到整数加法,优于DDA算法。
即:
di+1={di+2(A+B),di+2A,(di<0)(di≥0)
d0=2A+B