网上其他资料感觉是简单问题复杂化,用实数的有理数(整数之比)表达方式分析更直接些。
为简化分析假设两端点为(x0,y0),(xn,yn),且满足
0<=x0<xn, 0 <= y0<yn, xn-x0 >= yn-y0.
令dy=yn-y0,dx=xn-x0.
则通过两端点的直线方程为
y=dy/dx * (x-x0)+y0
第k个点(x_k=x0+k,y_k)满足
y_k = dy/dx*k+y0,
y_k+1 = y_k+dy/dx.
对正实数r记r = [r]+(r),当中[r]为整数,(r)为小数部分且-1/2 <= (r) <= 1/2, 相当于[r]为r的四舍五入结果。这里两边也可能是严格的小于号,但不影响分析。()与[]为运算符而不是通常意义下的括号。则所要绘制的点的坐标为(x_k,[y_k])。
y_k = [y_k] + (y_k)
y_k+1 = [y_k]+(y_k)+dy/dx
注意到这里x0,xn,y0,yn,dy,dx都是非负整数,当中dx>0.由于y_0=y0为整数,其小数部分(y_0)=0,(y_k)每次累加一个dy/dx或减去一个整数,因此(y_k)可以表示为
(y_k)=M/dx=2*M/(2*dx)=N/(2*dx)
这里N=2*M,M,N为整数。代入上式有
y_k+1 = [y_k] + (N+2*dy)/(2*dx)
因此只要N+2*dy>dx就说明[y_k]后面的一项大于0.5,[y_k+1]