logo

Algoritmo de dibujo de círculos de Bresenham

No es fácil mostrar un arco continuo y suave en la pantalla de la computadora, ya que la pantalla de nuestra computadora está hecha de píxeles organizados en forma de matriz. Entonces, para dibujar un círculo en la pantalla de una computadora, siempre debemos elegir los píxeles más cercanos de un píxel impreso para que puedan formar un arco. Hay dos algoritmos para hacer esto:

  1. Algoritmo de dibujo de círculo de punto medio
  2. Algoritmo de dibujo de círculos de Bresenham

Ya hemos discutido el Algoritmo de dibujo de círculo de punto medio en nuestra publicación anterior. En esta publicación discutiremos sobre el algoritmo de dibujo de círculos de Bresenham. 

log4j

Ambos algoritmos utilizan la característica clave del círculo: es altamente simétrico. Entonces, para un círculo completo de 360 ​​grados, lo dividiremos en 8 partes, cada octante de 45 grados. Para ello utilizaremos el algoritmo circular de Bresenham para calcular la ubicación de los píxeles en el primer octante de 45 grados. Se supone que el círculo está centrado en el origen. Entonces, por cada píxel (x y) que calcula, dibujamos un píxel en cada uno de los 8 octantes del círculo como se muestra a continuación: 



Para un píxel (xy) todos los píxeles posibles en 8 octantes' title=Para un píxel (xy) todos los píxeles posibles en 8 octantes


Ahora veremos cómo calcular la ubicación del siguiente píxel a partir de una ubicación de píxel previamente conocida (x y). En el algoritmo de Bresenham, en cualquier punto (x y) tenemos dos opciones: elegir el siguiente píxel en el este, es decir, (x+1 y) o en el sureste, es decir, (x+1 y-1).
 

circulo 2' loading='lazy' title=


Y esto se puede decidir utilizando el parámetro de decisión d como: 
 

  • Si d > 0 entonces se debe elegir (x+1 y-1) como el siguiente píxel, ya que estará más cerca del arco.
  • de lo contrario (x+1 y) se elegirá como siguiente píxel.


Ahora, para dibujar el círculo para un radio 'r' y centro (xc yc) dados, comenzaremos desde (0 r) y nos moveremos en el primer cuadrante hasta x=y (es decir, 45 grados). Deberíamos partir de la condición inicial enumerada: 
 

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

Ahora para cada píxel haremos las siguientes operaciones:  

formatear una fecha en java
  1. Establezca los valores iniciales de (xc yc) y (x y).
  2. Establezca el parámetro de decisión d en d = 3 – (2 * r).
  3. Llame a la función drawCircle(int xc int yc int x int y).
  4. Repita los siguientes pasos hasta x<= y:
    • si d< 0 set d = d + (4 * x) + 6.
    • De lo contrario, establezca d = d + 4 * (x – y) + 10 y disminuya y en 1.
    • Incrementa el valor de x.
    • Llame a la función drawCircle(int xc int yc int x int y).

función dibujarCírculo():  

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

A continuación se muestra la implementación en C del enfoque anterior. 

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

Producción: 
 

círculo' loading='lazy' title=


Ventajas  

  • Es un algoritmo simple.
  • Se puede implementar fácilmente
  • Está totalmente basado en la ecuación del círculo, es decir, x.2+y2=r2

Desventajas  

  • Existe un problema de precisión al generar puntos.
  • Este algoritmo no es adecuado para imágenes complejas y con muchos gráficos.
Crear cuestionario