数值微分算法(Digital Differential Analyzer,简称DDA):一种直接从直线的微分方程生成直线的方法。
首先,我们通过给定直线的两端点坐标 P 0 ( x 0 , y 0 ) {P_0}({x_0},{y_0}) P0(x0,y0)和 P 1 ( x 1 , y 1 ) {P_1}({x_1},{y_1}) P1(x1,y1),可以得到直线的微分方程:
d y d x = y 1 − y 0 x 1 − x 0 = k \frac{d_y}{d_x}=\frac{{y_1}-{y_0}}{{x_1}-{x_0}}=k dxdy=x1−x0y1−y0=k
DDA算法的原理:直线的一阶导数是连续的,而且Δy与Δx是成一定比例的 因此我们可以通过将当前位置的坐标在每个方向上增加一定的增量来确定下一个点的位置。
这就涉及到了增量算法:在一个迭代算法中,如果每一步的x,y值是前一步的值加上一个增量来获得的,则称为增量算法。
这里x,y方向的增量分别为:€Δx和€Δy
其中€的值是一个无穷小的数(int?float?),这里不太确定。当€无穷小时,可以获得一个精度无限高的直线。因为设备的精度有限,我们常取€= 1 m a x ( Δ x , Δ y ) \frac{1}{max({Δ_x,Δ_y})} max(Δx,Δy)1。
这样呢,可以使得 € Δ x , € Δ y {€Δ_x,€Δ_y} €Δx,€Δy有一个取值总为1,算法在最大位移方向上每次走一步(即增加一个像素,单位步长)。
最大位移方向(根据斜率k确定):
设一直线
y
=
3
x
+
1
y=3x+1
y=3x+1,斜率
k
k
k大于1。我们比较一下
x
x
x方向走1步和
y
y
y方向走1步的不同
x
x
x方向:
x
1
=
x
0
+
1
{x_1}={x_0}+1
x1=x0+1
y
1
=
y
0
+
3
∗
1
{y_1}={y_0}+3*1
y1=y0+3∗1
也就是说
x
x
x方向走了1个步长单位,而
y
y
y方向走了3个单位步长
y
y
y方向:
x
1
=
x
0
+
1
/
3
{x_1}={x_0}+1/3
x1=x0+1/3
y
1
=
y
0
+
1
{y_1}={y_0}+1
y1=y0+1
即
y
y
y方向走1个单位步长的时候,
x
x
x方向只走了
1
/
3
1/3
1/3个单位步长。
显然当x方向走1个单位步长的时候,点和点之间的距离会比较大。因此,我们这里选择的最大位移方向位y方向。
所以,我们在DDA算法中要考虑两种情况:
- 情况一:
∣ k ∣ > 1 |k|>1 ∣k∣>1, Δ y > Δ x {Δ_y}>{Δ_x} Δy>Δx,€= 1 / Δ y 1/{Δ_y} 1/Δy,此时 y y y方向为最大位移方向
x i + 1 = x i + 1 / k {x_{i+1}}={x_i}+1/k xi+1=xi+1/k,这里要再对 x i + 1 + 0.5 {x_{i+1}}+0.5 xi+1+0.5取整或者直接四舍五入取整。
y i + 1 = y i + 1 {y_{i+1}}={y_i}+1 yi+1=yi+1 - 情况二:
∣ k ∣ < 1 |k| < 1 ∣k∣<1, Δ x > Δ y {Δ_x}>{Δ_y} Δx>Δy,€= 1 / Δ x 1/{Δ_x} 1/Δx,此时 x x x方向为最大位移方向
x i + 1 = x i + 1 {x_{i+1}}={x_i}+1 xi+1=xi+1
y i + 1 = y i + k {y_{i+1}}={y_i}+k yi+1=yi+k,这里要再对 y i + 1 + 0.5 {y_{i+1}} + 0.5 yi+1+0.5取整或者直接四舍五入取整。
DDA算法的特点:
DDA算法是一个增量算法,每一点的坐标都可由前一个点的坐标加上1个增量求得。