直线的生成算法_DDA
DDA是数字微分分析式(digital differential analyzer)的缩写
为了设计DDA算法,我们需要基本的线性方程来得到直线的斜率,并在此基础上进行进一步的计算。方程是基于斜率-截距形式的直线
y=kx+b
设直线的起点为x1,y1,终点为x2,y2,则斜率为
k=x2−x1y2−y1=ΔxΔy
直线中的每一个点坐标都可以是有前一个点坐标变换一个增量Δx,Δy 而得到,即表示为递归式
xi+1=xi+Δxyi+1=yi+Δy
由于递归式的初值是直线的起点x1,y1,这样就可以使用加法来生成一条直线,具体方法为: 按照直线从x1,y1到x2,y2的方向不同,分为8个象限,如下图

不考虑和坐标轴平行的场景
| 象限 | Δx | Δy |
|---|---|---|
| 1a象限 | Δx=1 | Δy=k |
| 1b象限 | Δx=k1 | Δy=1 |
| 2a象限 | Δx=−1 | Δy=−k |
| 2b象限 | Δx=k1 | Δy=1 |
| 3a象限 | Δx=−1 | Δy=−k |
| 3b象限 | Δx=−k1 | Δy=−1 |
| 4a象限 | Δx=1 | Δy=k |
| 4b象限 | Δx=−k1 | Δy=−1 |
由上表可知,
- 当∣x2−x1∣ > ∣y2−y1∣,自增量为1的方向在x轴,否则在y轴、
- 自增的符号与x2−x1, y2−y1的方向相同
使用DDA算法,每生成一条直线需要做两次触发,每画线中的一点做两次加法操作,因此,使用DDA生成的直线的速度是相当快的
算法步骤
- 初始化点位 给定两个端点表示起点和终点x1,y1和x2,y2
- 计算斜率∣k∣,决定自增量的方向,由于需要得是∣k∣与1得关系,因此可以比较Δx,Δy得绝对值,只用加减法来实现算法
- 下一个点位位置计算,如果斜率k≤1x轴自增1, 否则y轴自增1
- 绘制点
- 重复3,4直到所有点位绘制完成
代码实现
请参考直线的生成算法_DDA