算法1 k>1
此时y增加1,x增加小于1,所以以y为主。
P1在直线的左方
假设直线上相邻两点S1,S2 ,S1.x < S2.x, S1在屏幕上逼近P1,S2应该逼近哪个点呢?
假设P2.x = p1.x + 1
因为S2.x = S1.x + ∆x
因为P1.x < S1.x < p1.x + 0.5
所以p1.x + ∆x < S1.x + ∆x<p1.x +∆x + 0.5
所以p1.x + ∆x < S2.x<p1.x +∆x + 0.5
因为 0<∆x<1,所以S2最小逼近P1,最大逼近P2.
P1在直线的右方
假设直线上相邻两点S1,S2 ,S1.x < S2.x, S1在屏幕上逼近P1,S2应该逼近哪个点呢?
假设P2.x = p1.x + 1
因为S2.x = S1.x + ∆x
因为P1.x -0.5 < S1.x < p1.x
所以p1.x + 0.5 + ∆x < S1.x + ∆x < p1.x +∆x
所以p1.x + 0.5 + ∆x < S2.x<p1.x +∆x
因为 0<∆x<1,所以S2最小逼近P1,最大逼近P2.
P1在直线上
假设直线上相邻两点S1,S2 ,S1.x < S2.x, S1在屏幕上逼近P1,S2应该逼近哪个点呢?
假设P2.x = p1.x + 1
因为S2.x = S1.x + ∆x
因为S1.x = P1.x,所以
S2.x = P1.x + ∆x
因为 0<∆x<1,所以S2最小逼近P1,最大逼近P2.
公式推导
通过前面的论证,我们可以得知:
给定一条直线y=kx+b,k>1时,假设直线上前面逼近屏幕的点为P1,那么下一个逼近点P2,
满足:
P2.x = P1.x 或者 P2.x = P1.x + 1
P2.y = P1.y + 1
设Dl = 1/k * (p1.y+1) -b/k - P1.x
Dr = P1.x + 1 - (1/k * (p1.y+1) -b/k)
Dl - Dr = 1/k * (p1.y+1) -b/k - P1.x - P1.x - 1 + (1/k * (p1.y+1) -b/k) = 2/k*(p1.y+1) - 2b/k - 2P1.x - 1
∆y(Dl-Dr) = 2∆x*(p1.y+1) - 2b∆x - (2P1.x-1)*∆y
因为b = P1.y - k*P1.x,所以
2b∆x = 2∆xP1.y - 2P1.x∆y
所以:
∆y(Dl-Dr) = 2∆x + ∆y,因此初始值D=2∆x + ∆y
下面推导D的递推关系:
设Dk = 2∆x*(pk.y+1) - 2b∆x - (2Pk.x-1)*∆y
DK+1 - DK = 2∆x*(pk+1.y+1) - 2b∆x - (2Pk+1.x-1)*∆y - 2∆x*(pk.y+1) + 2b∆x + (2Pk.x-1)*∆y
=2∆x -∆y*(2Pk+1.x - 2Pk.x)
= 2∆x - 2∆y(Pk+1.x - Pk.x)
所以:
DK+1 = DK + 2∆x - 2∆y(Pk+1.x - Pk.x)
所以当DK > 0 ,DK+1 = DK + 2∆x - 2∆y
当DK <= 0,DK+1 = DK + 2∆x
总结
给定一条直线y=kx+b,k>1,直线上两点S,E,公式如下:
设D初 = 2∆x + ∆y
DK+1 = DK + 2∆x - 2∆y (DK > 0)
DK+1 = DK + 2∆x (DK <= 0)