計算機圖形學學習筆記(4.1)畫線算法

前言

現在的顯示器都是像素點陣。但是圖形在計算機中都用連續的線段或多邊形等存儲。因此在顯示出來之前,要進行光柵化處理。

圖形的光柵化(圖形的掃描轉換)分成兩步:

1)根據圖形的定義 在點陣單元上確定最佳逼近 於圖形的像素集;

2)給像素指定合適 的顏色值。

如下圖,對於一個三角形進行光柵化:

4.1 畫線算法

直線是最基本的圖形,一個動畫或真實感圖形往往需要調用成千上萬次畫線程序,因此直線算法的好壞與效率將直接影響圖形的質量和顯示速度。

對於畫線算法,要處理的問題如下:

輸入:直線兩個端點的座標P0 (x0 ,y0 )和P1 (x1 ,y1 )

輸出:最佳逼近這條直線的像素點集

DDA畫線算法

       在確定像素點位置時可以利用直線方程 y = kx + b , 根據x點的座標得到y點的座標,但是這樣計算會使用到乘法,若是能將乘法運算轉換成加法運算,效率就會提高。數值微分DDA(Digital Differential Analyzer)法引進圖形學中一個很重要的思想——增量思想。

       假設x0已知,每次沿x軸方向前進一個像素(步長爲1),可以計算出相應的y值。因爲像素點的座標爲整數,所以還要將計算得到的y值進行取整處理,取整的方法是將其加0.5再取整。如下推論可以得到增量公式,它的含義是當前y值等於前一步的y值加上斜率k,k稱爲增量。

中點畫線算法

      中點畫線算法不使用直線的斜截式方程,而使用直線的一般式方程F(x, y) = Ax + By + C 。一條直線將平面劃分爲三個部分:直線上的點、直線上方的點和直線下方的點。中點畫線算法每次在x方向上的步長爲1,而在y方向上要不要變化需要判斷。其中判斷方法是取Pu和Pd的中點M,判斷M點在Q點的上方還是下方。若M點在Q點的下方,說明Pu點距離直線更近,所以選擇Pu點;若M點在Q點的上方,說明Pd點距離直線更近,所以選擇Pd點;若M點正好位於Q點處,則選擇Pu和Pd都可以。

 

根據以上算法很容易知道要求的下一個像素點的座標需要進行一次乘法運算和四次加法運算:di = A(Xi + 1) + B(Yi + 0.5) + C,其效率是很低的,因此這裏也引入增量的思想求di。

 

Bresenham算法

Bresenham算法並不依賴於直線方程,它提供了一個更一般的算法,該算法不僅有好的效率,而且有更廣泛的適用範圍。該算法的基本思想是通過各行、各列像素中心構造一組虛擬的網格線,按照直線起點到終點的順序,計算直線與各垂直網格線的交點,然後根據誤差項的符號確定該像素中與此交點最近的像素。該算法中增量 d = k ,且當d > 1時就將其減一,以保證算法的連續性。

將Bresenham算法進行一些改進:

經過改進2之後,就只需要用到整數加減法了。

 

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