Bresenham算法

1 算法原理算法

  基本原理從某處摘得:設直線方程爲yi+1=yi+k(xi+1-xi)+k。假設列座標象素已經肯定爲xi,其行座標爲yi。那麼下一個象素的列座標爲xi+1,而行座標要麼爲yi,要麼遞增1爲yi+1。是否增1取決於偏差項d的值。偏差項d的初值d0=0,x座標每增長1,d的值相應遞增直線的斜率值k,即d=d+k。一旦d≥1,就把它減去1,這樣保證d在0、1之間。當d≥0.5時,直線與垂線x=xi+1交點最接近於當前象素(xi,yi)的右上方象素(xi+1,yi+1);而當d<0.5時,更接近於右方象素(xi+1,yi)。爲方便計算,令e=d-0.5,e的初值爲-0.5,增量爲k。當e≥0時,取當前象素(xi,yi)的右上方象素(xi+1,yi+1);而當e<0時,取(xi,yi)右方象素(xi+1,yi)。spa

  因爲顯示直線的像素點只能取整數值座標,能夠假設直線上第i個像素點的座標爲(Xi,Yi),它是直線上點(Xi,Yi)最佳近似,而且Xi=Xi(假設m<1),以下圖所示.那麼直線上下一個像素點的可能位置是(Xi+1,Yi)或者(Xi+1,Yi+1).code

由圖可知:在x=Xi+1處,直線上的點y的值是:y=m(Xi+1)+b,該點離像素點(Xi+1,Yi)和像素點(Xi+1,Yi+1)的距離分別爲d1和d2。blog

    d1 = Y - Yi = m(Xi+1)+b - Yi;    (1)class

    d2 = (Yi+1) - Y = (Yi+1) - m(Xi+1) - b;    (2)變量

    兩個距離的差是:原理

    d1-d2 = 2m(Xi+1) - 2Yi + 2b -1;    (3)硬件

  對於公式(3):im

  a:當此值爲正時,d1>d2,說明直線上理論點離(Xi+1,Yi+1)像素較近,下一個像素點應取(Xi+1,Yi+1);img

  b:當此值爲負時,d1<d2,說明直線上理論點離(Xi+1,Yi)像素較近,下一個像素點贏取(Xi+1,Yi);

  c:當此值爲零時,d1=d2,說明直線上理論點離上、下兩個像素點的距離相等,取那個點都行,假設算法規定這種狀況下取(Xi+1,Yi+1)做爲下一個像素點。

  所以只要利用(d1-d2)的符號就能夠決定下一個像素點的選擇。需進一步定義一個判別式:

  Pi = △X × (d1-d2) = 2△Y·Xi - 2△X·Yi + c    (4)

    其中△X=(X2-X1)>0,所以Pi與(d1-d2)有相同的符號;

    △Y=Y2-Y1;m=△Y/△X;c=2△Y+△X(2b-1)

  對(4)進一步處理得出偏差判別遞推公式並消除常數c;

  將(4)中的下標i改成i+1,獲得:

  Pi+1 = △X × (d1-d2) = 2△Y·Xi+1 - 2△X·Yi+1 + c  (5)

  假設直線的初始端點剛好是其像素點的座標,即知足:

  Y1 = mX1 + b ;  (6)

  由公式(4)和(6)獲得p1的初始值:

  P1 = 2△Y - △X;  (7)

/*推導過程*/
Pi = △X × (d1-d2) = 2△Y·Xi - 2△X·Yi + c   (4)
Y1 = mX1 + b                                       (6)

P1 =  2△Y·X1 - 2△X·Y1 + c
    = 2△Y·X1 - 2△X·(△Y/△X·X1+b) + c
    = 2△Y·X1 - 2△Y·X1 - 2△X·b + c
    = c - 2△X·b
    = 2△Y+△X(2b-1) - 2△X·b
    = 2△Y - △X

  因此能夠用偏差判別變量,獲得以下算法表示:

  初始:P1 = 2△Y - △X  (8)

  當Pi>=0時:Yi+1 = Y+ 1,Xi+1 = X+ 1,Pi+1 = P+ 2(△Y-△X)[根據公式(4)和(5)得出]

/*推導過程*/
    Pi = △X × (d1-d2) = 2△Y·Xi - 2△X·Yi + c              (4)
Pi+1 = △X × (d1-d2) = 2△Y·Xi+1 - 2△X·Yi+1 + c      (5)

 (4)-(5)得:

 Pi+1 = Pi + (2△Y·Xi+1)-2△Y·Xi - (2△X·Yi+1)+2△X·Yi 

∵ Pi>0 時 Yi+1 = Yi + 1,Xi+1 = Xi + 1
∴ Pi+1 =  Pi + (2△Y·(Xi + 1))-2△Y·Xi - (2△X·(Yi + 1))+2△X·Yi 
           = Pi + 2(△Y-△X)

  不然:Yi+1 = Yi,Xi+1=X+ 1,Pi+1=Pi+2△y[根據公式(4)和(5)得出]

/*推導過程*/
    Pi = △X × (d1-d2) = 2△Y·Xi - 2△X·Yi + c              (4)
    Pi+1 = △X × (d1-d2) = 2△Y·Xi+1 - 2△X·Y(i+1) + c      (5)

 (4)-(5)得:

 Pi+1 = Pi + (2△Y·Xi+1)-2△Y·Xi - (2△X·Yi+1)+2△X·Yi 

∵ Pi>0 時 Yi+1 = Yi,Xi+1 = Xi + 1
∴ Pi+1 =  Pi + (2△Y·(Xi + 1))-2△Y·Xi - (2△X·(Yi))+2△X·Yi 
           =  Pi + 2△Y

  從(8)式能夠看出,第i+1步的判別變量Pi+1僅與第i步的判別變量Pi、直線的兩個端點座標份量差△X和△Y有關,運算中只含有整數相加和乘2運算,而乘2可利用算術左移一位來完成,所以這個算法速度快並易於硬件實現。

相關文章
相關標籤/搜索