Algoritmo de Bresenham para Pintar Círculos y Cuádricas en General Carlos E. Alvarez D. 06-39141 Contenido - Introducción - Algoritmo de Bresenham para Dibujar Líneas Rectas - Algoritmo de Bresenham para Dibujar Círculos - Algoritmo Rápido Basado en Algoritmo de Bresenham para Dibujar Elipses - Generalización del Algoritmo de Bresenham para Curvas Cuadráticas - Resumen de Aplicaciones e Importancia Introducción - Desarrollado por Jack E. Bresenham en I.B.M. en 1962 - Publicado en 1965 - Originalmente para dibujar líneas rectas - Modificado posteriormente para dar origen al conocido Bresenham’s Circle Algorithm Imagen: http://wscg.zcu.cz/wscg2003/Photos_2003/Bresenham.jpg Bresenham – Líneas Rectas Algoritmo Original - Para líneas en el primer octante desde p1 = (x1, y1 ) hasta p2 = (x2 , y2 ) (se traslada para que parta del origen) - Decisión E( ) o NE ( ) - El error para un píxel se define como la distancia vertical entre el píxel y la recta que se quiere dibujar [3,5,6] Bresenham – Líneas Rectas Algoritmo Original Cont. - Se usa el parámetro de decisión e0 < 0 ⇒ E - y e0 = 2dy− 2dx e0 > 0 ⇒ NE El error se calcula de manera incremental, de modo que ei+1 = ei + 2dy y si se elige E o NE ei+1 = ei + 2dy− 2dx respectivamente en el paso anterior, donde dx = x2 − x1 y dy = y2 − y1 [3,5,6] Bresenham – Líneas Rectas Algoritmo Original Cont. dx = x2 - x1 dy = y2 - y1 E = 2 * dy - dx Dn = E + dx = 2dy Dp = E - dx = 2dy - 2dx x = x1 DO WHILE x <= x2 IF E < 0 THEN E = E + Dn /* y = y + 0 */ ELSE E = E + Dp y = y + 1 END IF x = x + 1 DrawPoint (x, y) LOOP Sólo operaciones enteras [3,5,6] Bresenham - Círculos x ≥ 0, y ≥ 0, x ≥ y * - Se escoge el Arco donde - Los otros 8 arcos se pintan por simetría (8-way symmetry) - Decisión para el próximo píxel: S ( ) o SO ( ) - PS = (x, y+1) - PSO = (x −1, y+1) - Se define el error e= x2 + y2 − r 2 - eS = x2 + (y+1)2 − r 2 = e+ 2y−1 - eSO = (x −1)2 + (y+1)2 − r 2 = eS + 2x +1 -Se escoge error con menor módulo *Nótese dirección de los ejes [2,3,5,8] Bresenham - Círculos Error y Decisión eS > eSO ⇒ SO ⇔ eS > eS − 2x +1 ⇒ SO ⇔ −2x −1 ≤ −1∧ 0 < es <1 2eS > 2x −1 ⇒ SO Sólo operaciones enteras [2,3,5,8] Bresenham - Elipses - Ecuación x2 y2 + 2 =1 2 a b - Se divide en 4 cuadrantes (4-way symmetry) - Se dibuja primero el arco señalado por 1 y luego 2 - Decisión - 1 N ( ) o NO ( ) - 2 E( ) o SE ( ) - Error b2 x2 + a2 y2 = b2 a2 [2,3,6] Bresenham - Elipses Error y Decisión Caso 1 ⇔ ⇔ (Caso 2 es análogo) eNO < eN ⇒ NO 2 b2 x2 + a2 y2 − b2 a2 + a2 ( 2y+1) + b2 (1− 2x) > 0 ⇒ NO - En cada paso se chequea si la pendiente de la recta tangente a la elipse es -1 para cambiarla toma de decisión - Nótese, solo operaciones enteras [8] Bresenham - Cuádricas ( x − h) 2 = 4q ( y− k) - Ecuación - Si se coloca el vértice en el origen la ecuación de forma - implícita resultante es 2-way symmetry f (x, y) = x − 4qk 2 [8] Bresenham - Cuádricas Error y Decisión - Problema: tangente varía de cero a infinito - Al igual que con elipses hay que dividir la curva - 1 Pendiente va desde 0 hasta 1 - 2 Pendiente va desde 1 hasta infinito - Derivando, se tiene que la pendiente de la tangente es 1 cuando x = 2q [8] Bresenham - Cuádricas Error y Decisión - Caso 1 - Error inicial e0 = x2 + 2x +1− 4qy− 2q - Decisión E( ) o NE ( ) - E ⇒ ei+1 = ei + 2x + 3 - NE ⇒ e = e + 2x + 3− 4q i+1 i – 4q [8] Bresenham - Cuádricas Error y Decisión - Caso 2 1 2 - Error inicial e0 = x + x + − 4qy− 4q 4 - Decisión N( ) o NE ( ) - N ⇒ ei+1 = ei − 8q - NE ⇒ ei+1 = ei + 3x + 2 Sólo operaciones enteras en el cálculo iterativo [8] Bresenham Importancia y Aplicaciones - Preciso, cáculo incremental usando adición, sustracción y shifting (operaciones enteras), las cuales son standard en la mayoría de las arquitecturas. Muy eficiente - Para dibujo de líneas rectas, círculos, elipses, polinomios de segundo grado, curvas de Bézier 3er orden (grado 2) o mayor si se dividen en subcurvas de 3er orden. Bresenham Importancia y Aplicaciones - Implementado en plotters, en el firmware o hardware de la mayoría de las tarjetas gráficas modernas y en muchas librerías gráficas. - Hay que modificarlo para lograr anti-aliasing Referencias [1] Wikipedia (material consultado mas no citado): http://es.wikipedia.org/wiki/Algoritmo_de_Bresenham http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm [2] http://materias.fi.uba.ar/6671/primitivas_graficas2.pdf [3] http://free.pages.at/easyfilter/bresenham.html [4] http://www.differencebetween.com/difference-between- dda-and-vs-bresenhamalgorithm/ [5] Laura M. Castro Souto, Gráficos en Computación. Curso 2000/2001. Disponible en: http://www.madsgroup.org/~laura/recursos-ii/GC.pdf [6] John Kennedy, A Fast Bresenham Type Algorithm for Drawing Ellipses. Disponible en: http://homepage.smc.edu/kennedy_john/belipse.pdf [7] http://www.abreojosensamblador.net/html/Pags/Cap23.html [8] http://www.cs.colostate.edu/~cs410/lectures/L12_bresenham2.pdf