1. 程式人生 > >關於斜率大於1的中點畫線的公式推導

關於斜率大於1的中點畫線的公式推導

首先還是假設直線L的一般公式為:Ax+By+C=0,並且斜率大於1,那麼這個時候代表x變化慢,y變化快,那麼這時我們應該讓y每次遞增1,x是否遞增,需要判斷,判斷方法如下:

首先假設直線的起點(x1,y1),終點為(x2,y2),那麼從起點開始,起點的下一個點的座標應該是(x_next,y_next),因為y每次遞增1,所以y_next = y1+1,那麼x_next應該取哪個點呢?

設起點的正上方的點為V1(x1,y1+1),起點的右上方頂點V2(x1+1,y1+1),這兩個點的中間點M(x1+0.5,y1+1),假設直線L與y+1的交點Q(x_q,y_q),那麼Ax_q+By_q+C=0成立,因為點Q在直線上,那麼點M帶入直線L方程得到:

Ax_m + By_m+C = ?

假設x_m = x_q + dx,因為y_m = y_q,所以Ax_m + By_m + C = A(x_q + dx) + By_q + C = (Ax_q + By_q + C) + Adx,假設直線方程L的A>0,那麼如果中點M在Q的右側,則Adx > 0,否則Adx <=0。

那麼我們可以這樣:

當A>0時,

x_next = x_prev(L(x_m,y_m) > 0)

x_next =x_prev + 1 (Adx <=0)

當A<0時,則相反。

為了求增量,去除乘法,提升效率,我們計算增量的遞推公式。

假設點M在直線的右側,那麼Q此時為(x1,y1+1),那麼中點M2的座標為(x1+0.5,y1+2),那麼L(M2)=A(x1+0.5)+B(y1+2)+C= Ax1 + By1 + C + 0.5A + 2B,而L(M1) = A(x1 + 0.5)+B(y1+1)+C = Ax1 + By1 + C + 0.5A + B,

因此L(M2) = L(M1) + B

現在假設點M在直線的左側,那麼Q此時為(x1+1,y1+1),那麼中點M2的座標為(x1+1.5,y1+2),那麼L(M2) = A(x1+1.5)+B(y1+2)+C=Ax1 + By1 + C + 1.5A + 2B,而L(M1) = A(x1 + 0.5)+B(y1+1)+C = Ax1 + By1 + C + 0.5A + B,

因此L(M2) = L(M1) + A + B

因此

當A>0時

d_next = d_prev + B (d_prev >0)

d_next = d_prev + A + B(d_prev < = 0)

下面推出直線L的第一個增量d,L(x1+0.5,y1+1) = A(x1+0.5) + B(y1 +1) + C = Ax1 + By1 + C + 0.5A + B = 0.5A + B,為了提升效率,我們不要浮點數,此時取2d = A + 2B,那麼2d_next為:

2d_next = 2d_prev + 2B           (d_prev > 0)

2d_next = 2d_prev + 2(A+B)    (d_prev <=0)

到此,當A大於0,斜率大於1的情況,構造公式推導完畢。

如有不正確,請用證明的方式指出。