天天看點

計算機圖形學(二)劃線算法

一、光栅系統繪制圖形的原理

1、光栅系統的圖元都是由像素點組成的

2、像素點的坐标值都是整數,是離散的,是以表示圖形時會出現鋸齒現象 

3、要繪制圖形元素,就必須計算出組成圖形元素的所有像素點的坐标值 

4、好的算法(計算所有像素的坐标值)不但速度快,還要盡可能的減小鋸齒的影響

二、劃線算法

1、要求:給出線段的兩個端點的坐标值,繪制出直線 

2、可以計算出斜率 m 和節距 b

三、DDA算法

1、如果斜率 m 小于 1 ,則水準方向每增加一個機關,垂直方向就增加 m 個機關,即

yk+1 =yk + m

計算結果要四舍五入,這樣就可快速計算出線段上所有像素點的坐标值

2、如果斜率 m 大于 1,則垂直方向每增加一個機關,水準方向就增加 1/m 個機關,即

xk+1 = xk + 1/m 

計算結果要四舍五入

3、區分 m 大于或者小于 1 是為了在變化率較小的方向上計算,可以減少鋸齒

4、DDA算法的特點

充分利用了光栅的特性

比直接利用直線公式計算速度快,

累加過程中涉及到浮點運算,仍然耗時,且有誤差

三、Bresenham  劃線算法

1、基本思想

劃線過程中,一個方向上的坐标總是加1,另一方向上的坐标要麼不變、要麼加1,能不能通過某種方法做出判斷,利用上述特性,進而避免浮點運算 

如上圖所示:起始點的坐标為(xi,yi),則下一點的坐标應該為(xi+1,y),這一點叫理論計算點

由于光栅系統的坐标是離散的,理論計算點不存在,是以我們隻能從理論計算點的上面或者下面,即(xi+1,yi)或者(xi+1,yi+1)兩個裡面選一個

道理很簡單, 這兩個那個離理論計算點更近,就選哪個。

如圖:我們可以計算 d2-d1,如果大于零,則上面的點誤差更大,選則下面的點;如果小于零,則選擇上面的點。

2、消除浮點運算:

pk= (delta)x  乘以  (d2-d1)

将 d2-d1 乘以 delta x 就可以消除 m ,進而避免浮點運算

3、遞推公式

 pk+1 = pk + 2delta(y) - 2delta(x) (yk+1 - yk)

其中 

yk+1 - yk 的值根據 pk 的符号,要麼為零(即 y 坐标不變),要麼為 1(即向上遞增一個坐标)

4、初始值 p0

p0 = 2delta(y) - delta(x) 

5、例題 

//==========================================

本文轉自左洸部落格園部落格,原文連結:http://www.cnblogs.com/myqiao/archive/2011/06/09/2076467.html,如需轉載請自行聯系原作者

繼續閱讀