設過端點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))作爲當前點的座標。因爲:
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進行四捨五入後取整,這使得它不利於硬件實現。