

En gráficos por computadora , el algoritmo del círculo de punto medio se utiliza para determinar los puntos necesarios para rasterizar un círculo . Es una generalización del algoritmo de línea de Bresenham . El algoritmo se puede generalizar aún más a secciones cónicas . [ 1 ] [ 2 ] [ 3 ]
Resumen
Este algoritmo dibuja los ocho octantes simultáneamente, comenzando desde cada dirección cardinal (0°, 90°, 180°, 270°) y se extiende en ambas direcciones para alcanzar el múltiplo más cercano de 45° (45°, 135°, 225°, 315°). Puede determinar dónde detenerse porque, cuando y = x , ha alcanzado los 45°. La razón para usar estos ángulos se muestra en la imagen anterior: a medida que x aumenta, no omite ni repite ningún valor de x hasta alcanzar los 45°. Entonces, durante el bucle while , x se incrementa en 1 con cada iteración, e y se decrementa en 1 ocasionalmente, nunca excediendo 1 en una iteración. Esto cambia en 45° porque ese es el punto donde la tangente es elevación = recorrido . Mientras que elevación > recorrido antes y elevación < recorrido después.
La segunda parte del problema, el determinante, es mucho más compleja. Este determina cuándo decrementar y . Generalmente se aplica después de dibujar los píxeles en cada iteración, ya que nunca baja del radio del primer píxel. Dado que en una función continua , la función para una esfera es la misma que para un círculo cuyo radio depende de z (o de la tercera variable), es lógico pensar que el algoritmo para una esfera discreta ( de vóxeles ) también se basaría en el algoritmo del círculo del punto medio. Sin embargo, al observar una esfera, el radio entero de algunos círculos adyacentes es el mismo, pero no se espera que tenga exactamente el mismo círculo adyacente en el mismo hemisferio. En cambio, un círculo del mismo radio necesita un determinante diferente, para permitir que la curva se acerque ligeramente al centro o se extienda más.
- Ciento cincuenta círculos concéntricos dibujados con el algoritmo del círculo del punto medio.
Todos los círculos están dibujados en negro.
Círculos dibujados en rojo, negro y azul para demostrar su concentricidad.
Algoritmo
El objetivo del algoritmo es aproximar un círculo o, más formalmente, la curva.utilizando píxeles. Para simplificar, nuestro objetivo es aproximar un círculo de centro.y radio entero. Además, solo dibujamos hasta el primer octante del plano, para lo cual dibujamos una curva desde el puntoy procede en sentido contrario a las agujas del reloj hasta un ángulo de 45°; los octantes restantes se pueden llenar fácilmente rotando y/o reflejando ese primer segmento de la curva alrededor del centro. En cada paso, la ruta se extiende eligiendo el píxel adyacente que mejor satisface.
La dirección "rápida" en el primer octante (el vector base con el mayor aumento de valor) es la-dirección (véase diferenciación de funciones trigonométricas ). En la práctica, esto significa que el algoritmo siempre da un paso en la dirección positiva.dirección (hacia arriba), y ocasionalmente da un paso en la dirección "lenta" (la negativa)dirección, hacia la izquierda). Si el punto dibujado en el pasoes, por lo tanto imponemosy tienen que decidir si establecerao.
La elección se realiza calculando la distancia entre el punto medio de decisión.al centro del círculo, de ahí el nombre del algoritmo. Con la suposición anterior de un círculo de centro, esta distancia es igual a. SiEl punto medio matemáticamente se encuentra fuera del círculo, y el punto candidato más interno está endebe dibujarse. Inversamente si, el punto medio se encuentra dentro del círculo y el punto candidatosatisface mejor la ecuación del círculo. La iteración completa para el primer octante es la siguiente:
La iteración termina una vez que la línea de pendiente de 45°se cruza, por lo tanto, tan pronto como se cumple la condiciónse cumple.
Variante con aritmética basada en números enteros.
Al igual que con el algoritmo de la línea de Bresenham original , este algoritmo se puede optimizar para usar solo matemáticas basadas en números enteros. Comenzamos definiendo el error de radio.como la diferencia entrey el radio al cuadradopara evitar tener que calcular una raíz cuadrada costosa y no entera. Esto también cambia ligeramente la condición para determinar:
Para eliminar elEn este caso, el error de radio se puede calcular recursivamente:
Junto con la condición encomputaciónse convierte
Un valor inicialparase obtiene mediante aproximación:
Este algoritmo optimizado se puede implementar en Python de la siguiente manera:
import numpy as np # solo para el array de imágenesr = 67 # radio del círculoimg = np . zeros ([ 2 * r + 1 ] * 2 , dtype = int ) # imagen de tamaño (2r + 1) x (2r + 1) para ajustarse al círculo x , y , p = r , 0 , 1 - r # valores iniciales x0 = r, y0 = 0, p0 = 1 - r while x >= y : # mientras el punto (x, y) esté en el primer octante for j , k in [( 1 , 1 ), ( 1 , - 1 ), ( - 1 , 1 ), ( - 1 , - 1 )]: # dibujar en todos los cuadrantes img [ j * x + r , k * y + r ] = 1 img [ k * y + r , j * x + r ] = 1 x , y = x - ( 1 if p > 0 else 0 ), y + 1 # actualizar x e y según el error de radio p p += 1 - 2 * x + 2 * y si p > 0 sino 1 + 2 * y # actualiza el error de radio p con x e y actualizadosEl método de Jesko
Un algoritmo de círculo de punto medio mejorado [ 4 ] solo requiere 5 operaciones aritméticas por paso (para 8 píxeles) y, por lo tanto, es más adecuado para sistemas de bajo rendimiento. Las operaciones contadas en el bucle principal son:
- La comparación x >= y (se considera una resta: x - y >= 0)
- y=y+1 [y++]
- t1 + y
- t1 - x
- La comparación t2 >= 0 no se tiene en cuenta, ya que no se realiza ninguna operación aritmética real. En la representación en complemento a dos de las variables, solo es necesario comparar el bit de signo .
- x=x-1 [x--]
Operaciones: 5
t1 = r / 16 x = r y = 0 Repetir hasta que x < y El píxel (x, y) y todos los píxeles simétricos están coloreados (8 veces). y = y + 1 t1 = t1 + y t2 = t1 - x Si t2 >= 0 t1 = t2 x = x - 1
Dibujando octantes incompletos
Las implementaciones anteriores siempre dibujan solo octantes o círculos completos. Para dibujar solo un arco determinado desde un ánguloen ángulo, el algoritmo necesita primero calcular elycoordenadas de estos puntos finales, donde es necesario recurrir a cálculos trigonométricos o de raíz cuadrada (ver métodos para calcular raíces cuadradas ). Luego, el algoritmo de Bresenham se ejecuta sobre el octante o círculo completo y establece los píxeles solo si caen dentro del intervalo deseado. Después de completar este arco, el algoritmo puede finalizarse prematuramente.
Si los ángulos se dan como pendientes , entonces no es necesario usar trigonometría ni raíces cuadradas: simplemente compruebe queestá entre las pendientes deseadas.
Generalizaciones
También es posible utilizar el mismo concepto para rasterizar una parábola , una elipse o cualquier otra curva bidimensional . [ 5 ]
Referencias
- ↑ Donald Hearn; M. Pauline Baker (1994). Gráficos por computadora . Prentice-Hall. ISBN 978-0-13-161530-4.
- ↑ Pitteway, MLV, " Algoritmo para dibujar elipses o hipérbolas con un trazador digital ", Computer J., 10(3) noviembre de 1967, pp. 282–289
- ↑ Van Aken, JR, " Un algoritmo eficiente para dibujar elipses ", CG&A, 4(9), septiembre de 1984, págs. 24-35
- ↑ Para conocer el historial de publicación de este algoritmo, consulte https://schwarzers.com/algorithms
- ↑ Zingl, Alois (diciembre de 2014). "La belleza del algoritmo de Bresenham: una implementación sencilla para trazar líneas, círculos, elipses y curvas de Bézier" . easy.Filter . Alois Zingl . Consultado el 16 de febrero de 2017 .
Enlaces externos
- Dibujar círculos : un artículo sobre cómo dibujar círculos, que pasa de un esquema simple a uno eficiente.
- Algoritmo del círculo del punto medio en varios lenguajes de programación
- Algoritmos geométricos
- Geometría digital