直線段掃描轉換算法

數值微分(DDA)法

    設過端點P0(x0,y0)、P1(x1,y1)的直線段爲L(P0,P1),則直線段L的斜率   L的起點P0的橫座標x0L的終點P1的橫座標x1步進,取步長=1(個象素),用L的直線方程y=kx+b計算相應的y座標,並取象素點(x,round(y))作爲當前點的座標。因爲:

P0(x0,y0)、P1(x1,y1)的直線段爲L(P0,P1),則直線段L的斜率   L的起點P0的橫座標x0L的終點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每遞增1y遞增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方法掃描轉換連接兩點P00,0)和P15,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時,必須把xy地位互換,y每增加1x相應增加1/k。在這個算法中,yk必須用浮點數表示,而且每一步都要對y進行四捨五入後取整,這使得它不利於硬件實現。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章