光柵圖形學之直線段掃描算法(DDA)

說明:本文章系作者學習資料整理,不完善的地方請大家指正,謝謝!

摘自《計算機圖形學基礎教程》清華大學出版社 孫家廣 胡事民

 

 

我們知道利用任何畫圖工具,知道兩個點之後,便可以在窗口畫出一條直線,其計算機內部原理,便是利用了光柵化。計算機屏幕可以看作是有幾行幾列的單位正方形組成,在數學中線是沒有寬度的。當線與正方形的邊有交點時,我們需要判定選取正方形的哪個頂點作爲線上的一個點。這便引出了圖形掃描轉換的算法。

 

1概念

   圖形掃描轉換或光柵化:確定最佳逼近圖形的像素集合,並用指定屬性寫像素的過程。

 

  我們將直角座標系看作屏幕,用單元網格劃分。

2直線段掃描算法

 (1)DDA算法-----digital differential analyzer 數值微分算法

      其核心思想是在確定選取正方形的哪個頂點作爲直線上的點時,採用了四捨五入的方法。由已知兩點P1(x0,y0) 和P2(x1,y1) ,可以由直線方程 y=k*x+b 確定,

其中k=(y1-y0)/(x1-x0)  ,b也可以確定。當|k|< = 1,我們沿着x軸的方向進行計算,x每次加一個x的增量,在這裏我們認爲是增量是1。因爲x的值已知,通過直線方程我們可以得到y值,然而y值未必是整數,在此算法中對y值進行四捨五入運算。而當|k|>1,我們沿着y軸的方向進行計算,y每次加1,由y值計算x的值,並對x值進行四捨五入運算。

 

當|k|<=1時,由迭代公式yi+1=k*xi+1+b    推出 yi+1=k*(xi+1)+b  ; yi+1=k*xi+b+k

   所以yi+1=yi+k;

當|k|>1時,由以上迭代公式推出 xi+1=(yi+1-b)/k ; xi+1=(yi+1-b)/k ; xi+1=(yi-b)/k+ 1/k;

 所以 xi+1=xi+1/k;

 

 僞代碼如下:

     void DDALine(int x0,int y0,int x1,int y1) {

       float k;

       int dx= x1-x0 ,dy=y1-y0;

       float k=dy/dx;

       if (k >= -1&&k <= 1)  {

       int x;

       float y;

       for(x=x0;x < x1;x++)

       {

        drawpixel(x,int(y+0.5),color);  //利用不同的軟件,此畫點的命令有所不同

        y=y+k;

       }

       }

      else {

      int y;

      float x;

      for(y=y0;y<y1;y++) 

      {

           drawpixel(int(x+0.5),y,color)

            x = x + 1/k;

       }

      }

}

注:int(x+0.5)與round(x)的功能一樣,都是進行四捨五入運算。

 

缺陷:存在浮點數以及除法運算,計算速度慢。

 

 

 

 

 

 

 

 

發佈了13 篇原創文章 · 獲贊 1 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章