数值微分法(DDA)
一、原理
-
假定直线的起点、终点分别为:(x0,y0),(x1,y1),且都为整数。

则过端点P0(x0,y0),P1(x1,y1)的直线段L:y=kx+b,直线斜率为:
k=x1−x0y1−y0 (x1=x0)
-
假设x已知,即从x的起x0开始,沿x方向前进一个像素(步长= 1),可以计算出相应的y值。因为像素的坐标是整数,所以y值还要进行取整处理:
y=round(y)
-
DDA算法就是一个增量算法,即在一个迭代算法中,如果每一步的x、y值是用前一步的值加上一个增量来获得,则称为增量算法。
-
这种方法直观,但效率太低,因为每一步需要一次浮点乘法和一次舍入运算。
二、计算
yi+1=kxi+1+b=k(xi+Δx)+b=kxi+b+Δx=yi+kΔx
- 当x每递增1,y递增k(即直线斜率),即当xi+1=xi+1时,yi+1=yi+k;
- 取整:yi+1=round(yi+k+0.5);
- 注意上述分析的算法仅适用于∣k∣≤1的情形。在这种情况下,x每增加1,y最多增加1。
- 当∣k∣≥1时,y每增加1,x增加k1,之后同理。
三、举例
写出下列直线段P0(0,0)→P1(5,2)所经过实际坐标。

- 判断k值,决定使用谁为增量
k=5−02−0=0.4<1,使用x为增量,步长为1。
- 计算
xi+1yi+1=xi+1=yi+0.4
即:当xi+1=xi+1时,yi+1=yi+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 |
- 结果
经过如下5个坐标:
P0(0,0)、P1(1,0)、P2(2,1)、P3(3,1)、P4(4,2)、P5(5,2)