關於斜率大於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的情況,構造公式推導完畢。
如有不正確,請用證明的方式指出。