| Bresenham演算法是電腦圖形學領域使用最廣泛的直線掃描轉換演算法。仍然假定直線斜率在0~1之間,該方法類似於中點法,由一個誤差項符號決定下一個象素點。 演算法原理如下:過各行各列象素中心構造一組虛擬網格線。按直線從起點到終點的順序計算直線與各垂直網格線的交點,然後確定該列象素中與此交點最近的象素。該演算法的巧妙之處在於採用增量計算,使得對於每一列,只要檢查一個誤差項的符號,就可以確定該列的所求象素。 2.1.4所示,設直線方程為yi+1=yi+k(xi+1-xi)+k。假設行座標象素已經確定為xi,其列座標為yi。那麼下一個象素的行座標為xi+1,而列座標要麼為yi,要麼遞增1為yi+1。是否增1取決於誤差項d的值。誤差項d的初值d0=0,x座標每增加1,d的值相應遞增直線的斜率值k,即d=d+k。一旦 d≥1,就把它減去1,這樣保證d在0、1之間。當d≥0.5時,直線與垂線x=xi+1交點最接近於當前象素(xi,yi)的右上方象素(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,yi)右方象素(xi+1,yi)。 圖2.1.4 Bresenham演算法所用誤差項的幾何含義 Bresenham畫線演算法程式: void Bresenhamline (int x0,int y0,int x1, int y1,int color) { int x, y, dx, dy; float k, e; dx = x1-x0;dy = y1- y0;k=dy/dx; e=-0.5; x=x0,;y=y0; for (i=0;i<dx;i++) { drawpixel (x, y, color); x=x+1;e=e+k; if (e³0) { y++; e=e-1;} } } 舉例:用Bresenham方法掃描轉換串連兩點P0(0,0)和P1(5,2)的直線段。 x y e 0 0 -0.5 1 0 -0.1 2 1 -0.7 3 1 -0.3 4 2 -0.9 圖2.1.5 Bresenham演算法 5 2 -0.5 上述Bresenham演算法在計算直線斜率與誤差項時用到小數與除法。可以改用整數以避免除法。由於演算法中只用到誤差項的符號,因此可作如下替換:2*e*dx。 改進的Bresenham畫線演算法程式: void InterBresenhamline (int x0,int y0,int x1, int y1,int color) { dx = x1-x0,;dy = y1- y0,;e=-dx; x=x0; y=y0; for (i=0; i<dx; i++) {drawpixel (x, y, color); x++; e=e+2*dy; if (e³0) { y++; e=e-2*dx;} } |