数值微分法(DDA)详解

数值微分法(DDADDA

一、原理

  1. 假定直线的起点、终点分别为:(x0,y0)(x_0,y_0)(x1,y1)(x_1,y_1),且都为整数。
    数值微分法(DDA)详解
    则过端点P0(x0,y0)P_0 (x_0, y_0)P1(x1,y1)P_1(x_1, y_1)的直线段L:y=kx+bL:y=kx+b,直线斜率为:
    k=y1y0x1x0 (x1x0) k=\frac{y_1-y_0}{x_1-x_0}\ (x_1\neq x_0)

  2. 假设xx已知,即从xx的起x0x_0开始,沿xx方向前进一个像素(步长= 1),可以计算出相应的y值。因为像素的坐标是整数,所以y值还要进行取整处理:
    y=round(y) y=round(y)

  3. DDADDA算法就是一个增量算法,即在一个迭代算法中,如果每一步的xxyy值是用前一步的值加上一个增量来获得,则称为增量算法。

  4. 这种方法直观,但效率太低,因为每一步需要一次浮点乘法和一次舍入运算。

二、计算

yi+1=kxi+1+b=k(xi+Δx)+b=kxi+b+Δx=yi+kΔx \begin{aligned} y_{i+1} &= kx_{i+1}+b \\ &=k(x_i+\Delta x)+b\\ &=kx_i+b+\Delta x\\ &= y_i+k\Delta x\\ \end{aligned} \\

  • xx每递增11yy递增kk(即直线斜率),即当xi+1=xi+1x_{i+1}=x_i+1时,yi+1=yi+ky_{i+1}=y_i+k
  • 取整:yi+1=round(yi+k+0.5)y_{i+1}= round(y_i+k+0.5)
  • 注意上述分析的算法仅适用于k1|k|≤1的情形。在这种情况下,xx每增加11yy最多增加11
  • k1|k|\geq 1时,yy每增加11xx增加1k\frac{1}{k},之后同理。

三、举例

写出下列直线段P0(0,0)P1(5,2)P_0(0,0)\to P_1(5,2)所经过实际坐标。

数值微分法(DDA)详解

  1. 判断kk值,决定使用谁为增量
    k=2050=0.4<1k=\frac{2-0}{5-0}=0.4<1,使用xx为增量,步长为11
  2. 计算
    xi+1=xi+1yi+1=yi+0.4 \begin{aligned} x_{i+1}&=x_i+1\\ y_{i+1}&=y_i+0.4 \end{aligned}
    即:当xi+1=xi+1x_{i+1}=x_i+1时,yi+1=yi+0.4y_{i+1}=y_i+0.4
x y+0.5 int(y+0.5)
0 0+0.5 0
1 0.4+0.5 0
2 0.8+0.5 1
3 1.2+0.5 1
4 1.6+0.5 2
5 2.0+0.5 2
  1. 结果
    经过如下5个坐标:
    P0(0,0)P1(1,0)P2(2,1)P3(3,1)P4(4,2)P5(5,2)P_0(0,0)、P_1(1,0)、P_2(2,1)、P_3(3,1)、P_4(4,2)、P_5(5,2)