Bresenham畫線演算法

來源:互聯網
上載者:User
Bresenham畫線演算法
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,即ddk。一旦 d≥1,就把它減去1,這樣保證d在0、1之間。當d≥0.5時,直線與垂線x=xi+1交點最接近於當前象素(xiyi)的右上方象素(xi+1,yi+1);而當d<0.5時,更接近於右方象素(xi+1,yi)。為方便計算,令ed-0.5,e的初值為-0.5,增量為k。當e≥0時,取當前象素(xiyi)的右上方象素(xi+1,yi+1);而當e<0時,取(xiyi)右方象素(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;}

   }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.