直線掃描轉換-中點算法
采用增量思想的DDA算法,直觀、易實現,每計算一個象素坐標,只需計算一個加法。
(1)改進效率。這個算法每步只做一個加法,能否再提高效率?
一般情況下k與y都是小數,而且每一步運算都要對y進行四舍五入后取整。
唯一改進的途徑是把浮點運算變成整數加法!
(2)第二個思路是從直線方程類型做文章
而直線的方程有許多類型,如兩點式、一般式等。如用其它的直線方程來表示這條直線會不會有出人意料的效果?
中點畫線法
F(x,y) =0 直線的一般式方程:Ax+By+C=0
其中A=Y1-Y2
B=X2-X1
C=X1Y2-X2Y1
對於直線上的點: F(x,y)=0
對於直線上方的點: F(x,y)>>0
對於直線下方的點: F(x,y)<0
每次在最大位移方向上走一步,而另一個方向是走步還是不走步要取決於中點誤差項的判斷.
假定:0≤|k|≤1。因此,每次在x方向上加1,y方向上加1或不變需要判斷。
設U點為(xi+1,yi+1),D為(xi+1,yi),M(xi+1,yi+0.5)
當M在Q的下方,則u 離直線近,應為下一個象素點, 當M在Q的上方,應取d 為下一點.
如何判斷Q在M的上方還是下方?
把M代入理想直線方程:
di=A(xi+1)+B(yi+0.5)+C
當d<0時,M在Q下方,取U
當d>0時,M在Q上方,取D
當d=0時,M在Q上,取UD均可(一般取D)
用增量計算提高運算效率
d0=A+0.5B
d1=d0+A+B d0<0
d1=d0+A d0>=0
y=y+1 d<0
y=y d>=0
可以用2d代替d來擺脫浮點運算,寫出僅包含整數運算的算法。
當-1<k<0時的情況
推導過程如下:
第二個點應該是(5,0)
結論如下: d0=-A+0.5B
d1=d0-A+B d0<0
d1=d0-A d0>=0
也可以用2d來擺脫浮點運算
當1<k時的情況
推導過程如下:
注意:倒置后上下位置發生變化,因此x的取值和d的后續取值都發生變化
結論如下: d0=0.5A+B
d1=d0+A+B d0>0
d1=d0+B d0<=0
x=x d<=0
x=x+1 d>0
也可以用2d來擺脫浮點運算
當k<-1時的情況
推導過程如下:
下面的坐標應該是(3,0),從y0開始減。
結論如下: d0=0.5A-B
d1=d0+A-B d0<0
d1=d0-B d0>=0
也可以用2d來擺脫浮點運算