DDA 算法,即数值微分法(Digital Differential Analyzer),是一种基于直线的微分方程
线段的光栅化过程可以循环的让 x方向变化一个像素或者让 y方向变化一个像素,相应的另一个方向变化0 个像素或者1 个像素得到。这样计算直线段上的每个像素的坐标只需执行一次浮点数加法即可。此外,为了使得生成的直线段尽量连续均匀,相邻两个像素之间 ,x或y 的坐标最多相差 1 个像素。
生成直线的方法。
先上源码:
import matplotlib.pyplot as plt
def DDALine(x1, y1, x2, y2, color):
dx = x2 - x1
dy = y2 - y1
steps = 0
# 斜率判断
if abs(dx) > abs(dy):
steps = abs(dx)
else:
steps = abs(dy)
# 必有一个等于1,一个小于1
delta_x = float(dx / steps)
delta_y = float(dy / steps)
# 四舍五入,保证x和y的增量小于等于1,让生成的直线尽量均匀
x = x1 + 0.5
y = y1 + 0.5
for i in range(0, int(steps + 1)):
# 绘制像素点
plt.plot(int(x), int(y), color)
x += delta_x
y += delta_y
plt.show()
def main():
x = 0
y = 0
xEnd = 5
yEnd = 2
color = "r."
DDALine(x, y, xEnd, yEnd, color)
if __name__ == '__main__':
main()
效果展示:
算法特点:
DDA 算法中, 必须用浮点数表示,而且每一个像素的绘制都必须对 x 和 y 坐标进行舍入取整,这使得该算法不利于硬件实现。