所謂圖元的生成,是指完成圖元的引數表示形式(由圖形軟體包的使用者指定)到點陣表示形式(光柵顯示系統重新整理時所需的表示形式)的轉換。通常也稱掃瞄轉換圖元。
直線的掃瞄轉換:確定最佳逼近於該直線的一組畫素,並且按掃瞄線順序對這些畫素進行寫操作。
三個常用演算法:1、數值微分法dda;2、中點畫線法;3、bresenham演算法。
生成目標,求與直線段充分接近的畫素集
生成前提條件:1、畫素網格均勻,座標為整數值;2、直線段的寬度為1;3、直線段的斜率k的取值範圍為[-1,1]。
已知過端點p0 (x0, y0), p1(x1, y1)的直線段l:y=kx+b直線斜率為
計算yi+1 = kxi+1+b
= k1xi+b+kdx
= yi+kdx 當dx =1; yi+1 = yi+k 。
對應關係如下圖所示:
當前畫素點為p(xp, yp) ,下乙個象素點為p1或p2。設m=(xp+1, yp+0.5),為p1與p2的中點,q為理想直線與x=xp+1垂線的交點。將q與m的y座標進行比較。
如下圖所示:
當m在q的下方,則p2應為下乙個象素點;
當m在q的上方,應取p1為下一點。
構造判別式:d=f(m)=f(xp+1,yp+0.5) = a(xp+1)+b(yp+0.5)+c
其中a=y0-y1, b=x1-x0, c=x0y1-x1y0
當d<0,m在l(q點)下方,取右上上方pu為下乙個畫素;
當d>0,m在l(q點)上方,取右方pd為下乙個畫素;
當d=0,選p1或p2均可,約定取pd為下乙個畫素;
d是xp, yp的線性函式,因此可採用增量計算,提高運算效率。初值d0=f(x0+1, y0+0.5)=a+0.5b。
(1) 若當前象素處於d>=0情況,則取正右方畫素pd(xp+1, yp), 要判下乙個畫素位置,應計算:di+1=f(xp+2, yp+0.5)=a(xp+2)+b(yp+0.5)=d+a; 增量為a。
(2) 若d<0時,則取右上方畫素pu(xp+1, yp+1)。要判斷再下一畫素,則要計算:di+1= f(xp+2, yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b ;增量為a+b。
畫線從(x0, y0)開始,d的初值
d0=f(x0+1, y0+0.5)=f(x0, y0)+a+0.5b =a+0.5b。
可以用2d代替d來擺脫小數,提高效率。
用中點畫線法畫出p0(0,0) ,p1(5,2)的直線。
首先構造出判別式:d = a(xp+1)+b(yp+0.5)+c。其中a = y0 - y1 = -2,b = x1 - x0 = 5,c = x0y1 - x1y0 = 0。ixi
yid10
00.521
0-1.532
11.543
1-0.554
22.5
用座標表示,下圖:
過各行各列象素中心構造一組虛擬網格線。按直線從起點到終點的順序計算直線與各垂直網格線的交點,然後根據誤差項的符號確定該列象素中與此交點最近的象素。
設直線方程為:
,其中k=dy
/dx。 因為直線的起始點在象素中心,所以誤差項d的初值d0=0。
x下標每增加1,d的值相應遞增直線的斜率值k,即d=d+k。一旦d≥1,就把它減去1,這樣保證d在0、1之間。
當d≥0.5時,最接近於當前象素的右上方象素(xi+1,yi+1)
當d<0.5時,更接近於右方象素(xi+1,yi)。
為方便計算,令e=d-0.5,e的初值為-0.5,增量為k。
當e≥0時,取當前象素(xi,yi)的右上方象素(xi+1,yi+1);
當e<0時,更接近於右方象素(xi+1,yi)。
用bresenham演算法畫出p0(0,0) ,p1(5,2)的直線。
計算得出斜率k = dy/dx = 0.4。
結果如下表:ix
ye10
0-0.521
0-0.132
10.343
1-0.354
20.165
2-0.5
座標表示:
上述bresenham演算法在計算直線斜率與誤差項時用到小數與除法。可以改用整數以避免除法。由於演算法中只用到誤差項的符號,因此可作如下替換
這樣e』的初值是-dx,由於k=dy/dx,所以e』的增量就變為2*dy。
直線生成演算法
目的 理解基本圖形元素光柵化的基本原理 掌握一種基本圖形元素光柵化演算法 利用opengl實現直線光柵化的 dda演算法。要求 根據所給的直線光柵化的示範源程式,在計算機上編譯執行,輸出正確結果 了解和使用opengl的生成直線的命令,來驗證程式執行結果。include include includ...
實驗二 直線生成演算法
一 實驗目的和要求 1.理解基本圖形元素光柵化的基本原理,掌握一種基本圖形元素光柵化演算法,利用opengl實現直線光柵化的dda演算法。二 實驗內容及主要步驟 1 根據所給的直線光柵化的示範源程式,寫出dda演算法,在計算機上編譯執行,輸出正確結果 2 了解和使用opengl的生成直線的命令,來驗...
直線生成演算法 Bresenham畫線法
我們將平面劃分成十個部分,從第一象限的x軸開始做逆時針旋轉,每隔45度角為一部分,由此類推到第八部分。y軸正向為第九部分,負向為第十部分。當直線的斜率k 0,1 bresenham畫線演算法的基本原理是通過各行各列畫素中心構造一張虛擬網格線,按直線從起點到終點的順序計算直線與各垂直網格線的交點,然後...