直線掃描轉換-中點算法


直線掃描轉換-中點算法

采用增量思想的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來擺脫浮點運算


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM