logo

Algoritmus kreslenia Bresenhamovho kruhu

Nie je ľahké zobraziť súvislý hladký oblúk na obrazovke počítača, pretože obrazovka nášho počítača je vyrobená z pixelov usporiadaných v maticovej forme. Takže na nakreslenie kruhu na obrazovke počítača by sme mali vždy vybrať najbližšie pixely z vytlačeného pixelu, aby mohli tvoriť oblúk. Na to existujú dva algoritmy:

  1. Algoritmus kreslenia kruhu stredného bodu
  2. Algoritmus kreslenia Bresenhamovho kruhu

Už sme diskutovali o Algoritmus kreslenia kruhu stredného bodu v našom predchádzajúcom príspevku. V tomto príspevku budeme diskutovať o algoritme kreslenia Bresenhamovho kruhu. 

shweta tiwari

Oba tieto algoritmy využívajú kľúčovú vlastnosť kruhu, že je vysoko symetrický. Takže pre celý 360 stupňový kruh ho rozdelíme na 8 častí, každý oktan 45 stupňov. Aby sme to dosiahli, použijeme Bresenhamov kruhový algoritmus na výpočet umiestnenia pixelov v prvom oktante 45 stupňov. Predpokladá, že kružnica je vycentrovaná na počiatok. Takže pre každý pixel (x y), ktorý vypočíta, nakreslíme pixel v každom z 8 oktantov kruhu, ako je uvedené nižšie: 



Pre pixel (xy) všetky možné pixely v 8 oktantoch' title=Pre pixel (xy) všetky možné pixely v 8 oktantoch


Teraz uvidíme, ako vypočítať umiestnenie ďalšieho pixelu z predtým známeho umiestnenia pixelu (x y). V Bresenhamovom algoritme máme v ktoromkoľvek bode (x y) dve možnosti, buď zvoliť ďalší pixel na východe, t.j. (x+1 y) alebo na juhovýchode, t.j. (x+1 y-1).
 

kruh 2' loading='lazy' title=


A to sa dá rozhodnúť pomocou rozhodovacieho parametra d ako: 
 

  • Ak d > 0, potom (x+1 y-1) sa má zvoliť ako ďalší pixel, pretože bude bližšie k oblúku.
  • inak (x+1 y) sa vyberie ako ďalší pixel.


Teraz, aby sme nakreslili kružnicu pre daný polomer 'r' a stred (xc yc) Začneme od (0 r) a budeme sa pohybovať v prvom kvadrante až po x=y (t.j. 45 stupňov). Mali by sme začať od uvedenej počiatočnej podmienky: 
 

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

Teraz pre každý pixel vykonáme nasledujúce operácie:  

  1. Nastavte počiatočné hodnoty (xc yc) a (x y).
  2. Rozhodovací parameter d nastavte na d = 3 – (2 * r).
  3. Zavolajte funkciu drawCircle(int xc int yc int x int y).
  4. Opakujte nasledujúce kroky až do x<= y:
    • Ak d< 0 set d = d + (4 * x) + 6.
    • Inak nastavte d = d + 4 * (x – y) + 10 a znížte y o 1.
    • Zvýšte hodnotu x.
    • Zavolajte funkciu drawCircle(int xc int yc int x int y).

Funkcia drawCircle():  

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); } 

Nižšie je C implementácia vyššie uvedeného prístupu. 

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; } 

výstup: 
 

krúžkovanie' loading='lazy' title=


Výhody  

sonu nigam
  • Je to jednoduchý algoritmus.
  • Dá sa jednoducho implementovať
  • Je to úplne založené na rovnici kruhu, tj x2+y2=r2

Nevýhody  

  • Pri generovaní bodov je problém s presnosťou.
  • Tento algoritmus nie je vhodný pre zložité a vysoko grafické obrázky.
Vytvoriť kvíz