设过端点P0(x0 ,y0)、P1(x1 ,y1)的直线段为L(P0 ,P1),则直线段L的斜率 L的起点P0的横坐标x0向L的终点P1的横坐标x1步进,取步长=1(个象素),用L的直线方程y=kx+b计算相应的y坐标,并取象素点(x,round(y))作为当前点的坐标。因为:

yi+1 = kxi+1+b
= k1xi+b+kDx
= yi+kDx
所以,当Dx =1; yi+1 = yi+k。也就是说,当x每递增1,y递增k(即直线斜率)。根据这个原理,我们可以写出DDA画线算法程序。
DDA画线算法程序
void DDALine(int x0,int y0,int x1,int y1,int color)
{ int x;
float dx, dy, y, k;
dx = x1-x0; dy=y1-y0;
k=dy/dx,;y=y0;
for (x=x0;x< x1;x++)
{ drawpixel (x, int(y+0.5), color);
y=y+k;
}
}
注意:我们这里用整型变量color表示象素的颜色和灰度。
举例:用DDA方法扫描转换连接两点P0(0,0)和P1(5,2)的直线段。
x int(y+0.5) y+0.5
0 0 0
1 0 0.4+0.5
2 1 0.8+0.5
3 1 1.2+0.5
4 2 1.6+0.5 图2.1.1 直线段的扫描转换
注意:上述分析的算法仅适用于|k| ≤1的情形。在这种情况下,x每增加1,y最多增加1。当 |k| > 1时,必须把x,y地位互换,y每增加1,x相应增加1/k。在这个算法中,y与k必须用浮点数表示,而且每一步都要对y进行四舍五入后取整,这使得它不利于硬件实现。