首先还是假设直线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的情况,构造公式推导完毕。
如有不正确,请用证明的方式指出。