Algoritmo de Bresenham para Pintar Círculos y Cuádricas en General

Anuncio
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
Descargar