Bresenham画线K>1时的递归公式

算法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)

猜你喜欢

转载自blog.csdn.net/u011711997/article/details/86496369