关于斜率大于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的情况,构造公式推导完毕。

如有不正确,请用证明的方式指出。

猜你喜欢

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