Bresenhamin ympyrän piirustusalgoritmi

Bresenhamin ympyrän piirustusalgoritmi

Ei ole helppoa näyttää jatkuvaa tasaista kaaria tietokoneen näytöllä, koska tietokoneemme näyttö koostuu matriisimuotoon järjestetyistä pikseleistä. Joten piirtääksemme ympyrän tietokoneen näytölle meidän tulee aina valita tulostetusta pikselistä lähimmät pikselit, jotta ne voisivat muodostaa kaaren. Tämän tekemiseen on kaksi algoritmia:

  1. Keskipisteen ympyrän piirustusalgoritmi
  2. Bresenhamin ympyrän piirustusalgoritmi

Olemme jo keskustelleet Keskipisteen ympyrän piirustusalgoritmi edellisessä viestissämme. Tässä viestissä keskustelemme Bresenhamin ympyrän piirustusalgoritmista. 

Molemmat algoritmit käyttävät ympyrän keskeistä ominaisuutta, että se on erittäin symmetrinen. Joten koko 360 asteen ympyrälle jaamme sen 8 osaan, jokainen 45 asteen oktantti. Tätä varten käytämme Bresenhamin ympyräalgoritmia 45 asteen ensimmäisen oktantin pikselien sijainnin laskemiseen. Se olettaa, että ympyrän keskipiste on origossa. Joten jokaiselle pikselille (x y) se laskee, piirrämme pikselin jokaiseen ympyrän kahdeksaan oktanttiin alla olevan kuvan mukaisesti: 

Pikselille (xy) kaikki mahdolliset pikselit 8 oktantissaPikselille (xy) kaikki mahdolliset pikselit 8 oktantissa


Nyt näemme, kuinka lasketaan seuraava pikselin sijainti aiemmin tunnetusta pikselin sijainnista (x y). Bresenhamin algoritmissa meillä on missä tahansa kohdassa (x y) kaksi vaihtoehtoa joko valita seuraava pikseli idässä eli (x+1 y) tai kaakossa eli (x+1 y-1).
 

ympyrä 2


Ja tämä voidaan päättää käyttämällä päätösparametria d seuraavasti: 
 

  • Jos d > 0, niin (x+1 y-1) on valittava seuraavaksi pikseliksi, koska se on lähempänä kaaria.
  • muuten (x+1 y) on valittava seuraavaksi pikseliksi.


Piirretään nyt ympyrä annetulle säteelle 'r' ja keskipisteelle (xc yc) Aloitamme kohdasta (0 r) ja siirrymme ensimmäisessä neljänneksessä x=y:ään (eli 45 astetta). Meidän tulee aloittaa luetelluista alkuehdoista: 
 

 d = 3 - (2 * r)   
x = 0
y = r

Nyt jokaiselle pikselille teemme seuraavat toiminnot:  

  1. Aseta alkuarvot (xc yc) ja (x y).
  2. Aseta päätösparametriksi d d = 3 – (2 * r).
  3. Kutsu funktio drawCircle(int xc int yc int x int y).
  4. Toista seuraavat vaiheet, kunnes x <= y:
    • Jos d < 0 set d = d + (4 * x) + 6.
    • Muutoin aseta d = d + 4 * (x – y) + 10 ja vähennä y:tä yhdellä.
    • Kasvata x:n arvoa.
    • Kutsu funktio drawCircle(int xc int yc int x int y).

drawCircle()-funktio:  

CPP
   // function to draw all other 7 pixels   // present at symmetric position   drawCircle  (  int     xc       int     yc       int     x       int     y  )   {      putpixel  (  xc  +  x       yc  +  y       RED  );      putpixel  (  xc  -  x       yc  +  y       RED  );      putpixel  (  xc  +  x       yc  -  y       RED  );      putpixel  (  xc  -  x       yc  -  y       RED  );      putpixel  (  xc  +  y       yc  +  x       RED  );      putpixel  (  xc  -  y       yc  +  x       RED  );      putpixel  (  xc  +  y       yc  -  x       RED  );      putpixel  (  xc  -  y       yc  -  x       RED  );   }   

Alla on yllä olevan lähestymistavan C-toteutus. 

CPP
   // C-program for circle drawing   // using Bresenham’s Algorithm   // in computer-graphics   #include         #include         #include         // Function to put pixels   // at subsequence points   void     drawCircle  (  int     xc       int     yc       int     x       int     y  ){      putpixel  (  xc  +  x       yc  +  y       RED  );      putpixel  (  xc  -  x       yc  +  y       RED  );      putpixel  (  xc  +  x       yc  -  y       RED  );      putpixel  (  xc  -  x       yc  -  y       RED  );      putpixel  (  xc  +  y       yc  +  x       RED  );      putpixel  (  xc  -  y       yc  +  x       RED  );      putpixel  (  xc  +  y       yc  -  x       RED  );      putpixel  (  xc  -  y       yc  -  x       RED  );   }   // Function for circle-generation   // using Bresenham's algorithm   void     circleBres  (  int     xc       int     yc       int     r  ){      int     x     =     0       y     =     r  ;      int     d     =     3     -     2     *     r  ;      drawCircle  (  xc       yc       x       y  );      while     (  y     >=     x  ){          // check for decision parameter      // and correspondingly       // update d y      if     (  d     >     0  )     {      y  --  ;         d     =     d     +     4     *     (  x     -     y  )     +     10  ;      }      else      d     =     d     +     4     *     x     +     6  ;      // Increment x after updating decision parameter      x  ++  ;          // Draw the circle using the new coordinates      drawCircle  (  xc       yc       x       y  );      delay  (  50  );      }   }   int     main  ()   {      int     xc     =     50       yc     =     50       r     =     30  ;      int     gd     =     DETECT       gm  ;      initgraph  (  &  gd       &  gm       ''  );     // initialize graph      circleBres  (  xc       yc       r  );     // function call      return     0  ;   }   

Lähtö: 
 

ympyrä


Edut  

  • Se on yksinkertainen algoritmi.
  • Se voidaan toteuttaa helposti
  • Se perustuu täysin ympyrän yhtälöön eli x 2 +y 2 =r 2

Haitat  

  • Pisteitä luotaessa on tarkkuusongelma.
  • Tämä algoritmi ei sovellu monimutkaisille ja korkealaatuisille kuville.
Luo tietokilpailu