logo

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. 

java-merkkijono vertailuun

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 oktantissa' title=Pikselille (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' loading='lazy' title=


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ö: 
 

lista menetelmistä java

ympyrä' loading='lazy' title=


Edut  

  • Se on yksinkertainen algoritmi.
  • Se voidaan toteuttaa helposti
  • Se perustuu täysin ympyrän yhtälöön eli x2+y2=r2

Haitat  

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