bresenham畫圓算法


中點畫圓算法在一個方向上取單位間隔,在另一個方向的取值由兩種可能取值的中點離圓的遠近而定。實際處理中,用決策變量的符號來確定象素點的選擇,因此算法效率較高。

  Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁一、中點畫圓算法描述

  設要顯示圓的圓心在原點(0,0),半徑為R,起點在(0,R)處,終點在(Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁)處,順時針生成八分之一圓,利用對稱性掃描轉換全部圓。

  為了應用中點畫圓法,我們定義一個圓函數

F(x,y)=x2+y2-R2 (2-19)

 

  任何點(x,y)的相對位置可由圓函數的符號來檢測:

F(x,y) Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁 <0 點(x,y)位於數學圓內

 

=0 點(x,y)位於數學圓上

>0 點(x,y)位於數學圓外

(2-20)

 

 

  如下圖所示,圖中有兩條圓弧A和B,假定當前取點為Pi(xi,yi),如果順時針生成圓,那么下一點只能取正右方的點E(xi+1,yi)或右下方的點SE(xi+1,yi-1)兩者之一。

Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁

中點畫線算法

  假設M是E和SE的中點,即 Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁,則:  1、當F(M)<0時,M在圓內(圓弧A),這說明點E距離圓更近,應取點E作為下一象素點;

  2、當F(M)>0時,M在圓外(圓弧B),表明SE點離圓更近,應取SE點;

  3、當F(M)=0時,在E點與SE點之中隨便取一個即可,我們約定取SE點。

  Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁二、中點畫圓算法思想

  因此,我們用中點M的圓函數作為決策變量di,同時用增量法來迭代計算下一個中點M的決策變量di+1。

Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁 (2-21)

 

  下面分兩種情況來討論在迭代計算中決策變量di+1的推導。

  1、見圖(a),若di<0,則選擇E點,接着下一個中點就是Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁,這時新的決策變量為:

Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁 (2-22)

 

Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁

(a)(di<0) 中點畫線算法

  式(2-22)減去(2-21)得:

di+1=di+2xi+3 (2-23)

 

  2、見圖(b),若di≥0,則選擇SE點,接着下一個中點就是Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁 ,這時新的決策變量為:

Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁 (2-24)

 

Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁

(b)(di≥0) 中點畫線算法

  式(2-24)減去(2-21)得:

di+1=di+2(xi-yi)+5 (2-25)

 

  我們利用遞推迭代計算這八分之一圓弧上的每個點,每次迭代需要兩步處理:

   (1)用前一次迭代算出的決策變量的符號來決定本次選擇的點。

   (2)對本次選擇的點,重新遞推計算得出新的決策變量的值。

  剩下的問題是計算初始決策變量d0,如下圖所示。對於初始點(0,R),順時針生成八分之一圓,下一個中點M的坐標是Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁 ,所以:

Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁 (2-26)

 

Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁

生成圓的初始條件和圓的生成方向

  Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁三、中點畫圓算法實現

  1、輸入:圓半徑r、圓心(x0,y0);

  2、確定初值:x=0,y=r、d=5/4-r;

  3、While(x<=y)

   {

    ·利用八分對稱性,用規定的顏色color畫八個象素點(x,y);

    · 若d≥0

      {

       y=y-1;          //wind:個人覺得這句應該置於下句

       d=d+2(x-y)+5);

      }

     否則

       d=d+2x+3;

    ·x=x+1;

   }

  Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁五、中點畫圓算法完善

  在上述算法中,使用了浮點數來表示決策變量d。為了簡化算法,擺脫浮點數,在算法中全部使用整數,我們使用e=d-1/4代替d。顯然,初值d=5/4-r對應於e=1-r。決策變量d<0對應於e<-1/4。算法中其它與d有關的式子可把d直接換成e。又由於e的初值為整數,且在運算過程中的迭代值也是整數,故e始終是整數,所以e<-1/4等價於e<0。因此,可以寫出完全用整數實現的中點畫圓算法。

  要求:寫出用整數實現的中點畫圓算法程序,並上機調試,觀看運行結果。

  Bresenham畫圓和橢圓程序 - 隨風倒上 - 趙志剛--Greddy的個人主頁六、中點畫圓算法程序

 1 void MidpointCircle(int x0,int y0,int r,int color)
 2 
 3 {
 4 
 5  int x,y;
 6 
 7  float d;
 8 
 9  x=0;
10 
11  y=r;
12 
13  d=5.0/4-r;
14 
15  while(x<=y)
16 
17  {
18 
19   putdot(x0,y0,x,y,color);
20 
21   if(d<0)
22 
23   d+=x*2.0+3;
24 
25   else
26 
27   {
28 
29    d+=2.0*(x-y)+5;
30 
31    y--;
32 
33   } 
34 
35   x++;
36 
37  }
38 
39 }
40 
41 putdot(x0,y0,x,y,color)
42 
43 {
44 
45  putpixel(x0+x,y0+y,color);
46 
47  putpixel(x0+x,y0-y,color);
48 
49  putpixel(x0-x,y0+y,color);
50 
51  putpixel(x0-x,y0-y,color);
52 
53  putpixel(x0+y,y0+x,color);
54 
55  putpixel(x0+y,y0-x,color);
56 
57  putpixel(x0-y,y0+x,color);
58 
59  putpixel(x0-y,y0-x,color);
60 
61 }
62  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM