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 = Yi + 1,Xi+1 = Xi + 1,Pi+1 = Pi + 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=Xi + 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可利用算術左移一位來完成,所以這個算法速度快並易於硬件實現。