Академический Документы
Профессиональный Документы
Культура Документы
ndice
1. Algoritmos de Dibujo de Lneas
1. 2. 3. Algoritmo Bsico Incremental (DDA) Algoritmo de Bresenham Propiedades de las Lneas
2.
3.
Algoritmos de Relleno
1. 2. Relleno de Polgonos por Scan-line Relleno por Inundacin
4. 5.
Primitivas 2D
En los sistemas raster, las imgenes vienen definidas por la intensidad de sus pixels
aplicacin
controlador grfico
controlador de vdeo
Primitivas 2D
Los objetos presentes en la imagen se componen de primitivas simples (lneas, puntos) El sistema grfico dibuja estas primitivas transformndolos en pixels Rasterizacin
Fila i
Memoria de vdeo
Los mtodos de conversin deben ser lo ms eficientes posible La primitiva Punto es la ms sencilla:
se coloca la intensidad deseada en la celda de memoria del frame buffer correspondiente Cuando el haz de electrones pase por esa lnea horizontal (scan-line), emitir al pasar por esa posicin
Es necesario disponer de mtodos para convertir primitivas en pixels de la forma ms eficiente posible
correcto
incorrecto
El algoritmo ms sencillo
La ecuacin de una recta es m es la pendiente b es el corte con el eje y
y0
y = mx + b
y1
P1
Calcular Calcular
m=
y y1 y 0 = x x1 x0
P0
x0 x1
b = y 0 mx0
No es muy eficiente Cada paso requiere una multiplicacin flotante, una suma y un redondeo
Cada pixel se calcula en funcin del anterior No hace falta calcular b Si m>1 falla pues quedan huecos Solucin: intercambiamos las variables x e y Sabemos que xi = (1/m) (yi b) . Entonces: xi+1 = (1/m)yi+1 - b/m = xi+1 = xi + y/m Como y=1, llegamos a la frmula final xi+1 = xi + 1/m
Algoritmo de Bresenham
Slo usa aritmtica entera Supongamos el caso 0 < m < 1 hay que decidir qu pixel dibujamos a continuacin, y slo hay dos candidatos! yk+1 yk xk xk+1 El algoritmo debe decidir cul de los dos pintar Partamos del pixel (xk, yk), y hay que decidir entre el pixel (xk+1, yk) o (xk+1, yk+1) Para ello calculemos la distancia vertical entre el centro de cada pixel y la lnea real y = m (xk + 1) + b yk+1
d2 d1
yk
xk
xk+1
Algoritmo de Bresenham
La diferencia entre ambas constantes nos ayudar a decidir qu pixel pintar d1 d2 = 2m (xk + 1) 2yk + 2b 1 Multiplicando por x eliminamos el parmetro m, que no es entero pk = x (d1 d2) = 2 y xk 2 x yk + C, donde C = 2 y + x (2b 1)
Como x > 0, el signo de pk coincide con el de la diferencia (d1 d2), y por tanto: Si pk > 0 Si pk < 0 d1 > d2 d1 < d2 hay que pintar el pixel (xk+1, yk+1) hay que pintar el pixel (xk+1, yk)
yk+1 d2 d1
La gran ventaja es que puede calcularse pk+1 a partir del anterior pk, utilizando solamente aritmtica entera! pk+1 = = pk + 2 y 2 x (yk+1 yk) 0 1 dependiendo del signo de pk
yk xk xk+1
Algoritmo de Bresenham
Funcion Bresenham (int x0, y0, x1, y1) // slo para el caso 0 < m < 1, siendo x0 < x1
Pintar Pixel (x0, y0) Calcular las constantes A=2y, B=2y-2x Si m > 1, intercambiamos las variables x e y
Para cada xk sobre la lnea si pk < 0 Pintar Pixel (xk+1, yk) pk+1 = pk + A si pk > 0 Pintar Pixel (xk+1, yk+1) pk+1 = pk + B
Ejemplo
P0 = (20, 10) P1 = (30, 18) x = 10 y = 8 p0 = 6 2y = 16 2y - 2x = -4
ymax
xmax Fila 0
(1,0) (2,0)
(0,0)
Fila 1
Si el punto (0,0) fuera la esquina superior izquierda, y la y creciera hacia abajo, habra que usar I(x, ymax-y) en lugar de I(x,y)
Frame Buffer
Si I es la intensidad de cada pixel, la intensidad por unidad de longitud de A es I, pero la de B es I/V2 el ojo lo nota Solucin: Que la intensidad de los pixels dependa de la pendiente
Tipos de lnea
Existen varios tipos: continua, discontinua, con puntos Los procedimientos para dibujar estas lneas van mostrando secciones contiguas de pixels, y luego se van saltando otros Cmo se puede implementar esto? Las secciones de pixels se especifican mediante una mscara Ejemplo: 1111000 se pintan 4 pixels y se saltan 3 Al fijar el nmero de pixels, las longitudes son diferentes segn la direccin Solucin: ajustar el nmero de pixels dependiendo de la pendiente Otra forma para dibujar lneas discontinuas sera tratar cada tramo como una lnea individual
Grosor de lnea
Cmo podemos pintar lneas de grosor mayor que 1? Solucin: si la pendiente es menor que 1, para cada posicin de x pintamos una seccin vertical de pixels, tantos como ancho de lnea queramos, por igual a cada lado Si la pendiente es mayor que 1, se usan secciones horizontales
Hay que tener en cuenta que el ancho de las lneas horizontales y verticales ser V2 veces ms grueso que las diagonales
Butt cap
Round cap
Projected cap
Otra forma para dibujar lneas gruesas es pintar el rectngulo relleno Tambin aparecen problemas al conectar lneas Tres soluciones diferentes: aparecen huecos en las uniones!
Miter join
Round join
Bend join
Dibujo de circunferencias
La ecuacin de un crculo de radio R centrado en (x0, y0) es (x-xc)2 + (y-yc)2 = R2 R Algoritmo de fuerza bruta: (xc,yc)
Calcular
y = y 0 R 2 ( x x0 ) 2
No es nada eficiente Cada paso requiere una raz cuadrada El espaciado entre pixels no es uniforme
Otra forma
Cmo solucionar lo de los agujeritos? Pasando a coordenadas polares El valor del incremento del ngulo t debe ser lo suficientemente pequeo para evitar los huecos Podemos reducir clculo aplicando simetras: t= R 2 3 1 t=3/2 4 Incluso el primer octante es simtrico al segundo a travs de la diagonal 2 1 Conclusin: dibujando slo el segundo octante, desde x=0 hasta x=y podemos pintar todo el crculo Problema: se necesitan races cuadradas y funciones trigonomtricas demasiado costoso x = xc + R cos t y = yc + R sin t
t=/2 (xc,yc)
t=0
Este test lo ejecutaremos en los puntos medios entre los pixels que hay que decidir
pk+1 = pk + 2xk+1 + 1 + (y2k+1y2k) (yk+1yk) 0 1 dependiendo del signo de pk Por lo tanto: Si pk < 0 Si pk > 0 pk+1 = pk + 2xk+1 + 1 hay que pintar el pixel (xk+1, yk) hay que pintar el pixel (xk+1, yk-1)
Empezamos en el punto (0, R). Cunto vale p0? p0 = f (1, R-1/2) = = 5/4 R no es entero!
Sin embargo, da igual. Podemos redondearlo, porque todos los incrementos son enteros, y slo queremos utilizar el signo de pk, y no su valor
Calcular p0 = 5/4 R
// si R es entero, p0 = 1-r
Para cada xk si pk < 0 Pintar Pixel (xk+1, yk) pk+1 = pk + 2xk + 3 si pk > 0 Pintar Pixel (xk+1, yk-1) pk+1 = pk + 2xk 2yk + 5
Ejemplo
R = 10 p0 = 9 (x0, y0) = (0, 10)
Tipos de lneas
Para dibujar lneas discontinuas usaremos mscaras como en las rectas Al copiar al resto de octantes hay que tener en cuenta la secuencia del interespaciado Las longitudes varan con la pendiente
Grosor de lnea
1. 2. 3. Existen 3 mtodos: Pintando secciones horizontales o verticales segn sea la pendiente mayor o menor que 1 Rellenar el espacio entre dos curvas paralelas, separadas por una distancia igual al ancho que queremos 1 1 1 Usar una brocha e irla moviendo a lo largo de la curva 1 1 1 1 1 1
Relleno de primitivas
Dada un rea cerrada, hay que ser capaz de rellenar los pixels interiores con un color determinado
Relleno de primitivas
Existe 2 categoras de mtodos
1.
Relleno por scan - line: fila a fila va trazando lneas de color entre aristas
2.
Relleno por inundacin: a partir de un punto central, se va expandiendo recursivamente hasta alcanzar el borde del objeto
x0
x1
x2
x3
Podemos ir incrementando el contador en x unidades en cada scan-line Cuando el contador supere y, restamos y y hacemos x++
yt
xd
1/m
Se crea un vector vaco, con tantas posiciones como filas tenga la pantalla, y se coloca cada arista en la posicin de la scan-line del punto ms bajo
Funcion Scanline() Inicializar LBA vaca y crear TB Repetir hasta que LBA y TB vacas Mover de TB a LBA lados con ymin = y Ordenar LBA segn x Rellenar usando pares de x de LBA Eliminar lados de LBA con y = ymax Incrementar y a la siguiente scan-line Actualizar las x en LBA
Funcion Inundacin(x, y, col1, col2) El algoritmo se presta a un esquema recursivo muy simple color = LeerPixel (x,y) Si (color!=col1 && color!=col2) entonces PintaPixel (x,y,col1) Inundacin (x+1, y, col1, col2); Inundacin (x-1, y, col1, col2); Inundacin (x, y+1, col1, col2); Inundacin (x, y-1, col1, col2);
La solucin consiste en no explorar todos los vecinos de cada pixel, sino slo a lo largo de un scan-line Rellenamos el span donde se encuentra el punto inicial Adems, guardamos las posiciones iniciales de todos los spans de las lneas horizontales contiguas al scan-line
Tcnicas anti-aliasing
Las primitivas construidas con los algoritmos raster tienen una apariencia de escalera, debido a la discretizacin en pixels Soluciones hardware:
mayor resolucin de las pantallas existe un lmite para que el Frame Buffer mantenga su refresco a 30 Hz pixels ms pequeos: existe un lmite en la precisin del haz de electrones
Imagen digitalizada
Super-sampling
Consiste en incrementar virtualmente la malla de pixels, engaando a Bresenham Una vez calculada la recta para los subpixels, determinamos el color del pixel real Cada pixel representa entonces un rea finita de la pantalla, y no un punto infinitesimal
Para dibujar una recta, contamos el nmero de subpixels que estn sobre la lnea La intensidad del pixel final ser proporcional al contador anterior Para mscaras 3x3 tendremos 3 posibles intensidades
33%
66%
66%
100%
33%
Bresenham en pixels
Bresenham en subpixels
Apariencia final
Super-sampling
Otra versin de super-sampling diferente consiste en considerar que las lneas tienen un grosor de 1 pixel son en realidad un rectngulo Lo que hacemos entonces es contar los subpixels que caen dentro del rectngulo Para mscaras 3x3 tendramos 9 intensidades diferentes Se requiere ms clculo que la versin anterior, pero el resultado es ms exacto
NOTA: Si el fondo de la imagen tiene color, debemos promediar entre ambos colores para determinar el valor del pixel
Area-sampling
La intensidad del pixel viene dada por el rea de interseccin entre cada pixel y el objeto que se va a dibujar Para estimar el rea sera muy costoso evaluar la integral Lo que hacemos es testear una malla de puntos interiores al pixel y calcular cuntos caen dentro del rectngulo mtodo de integracin de Montecarlo Si el fondo tambin tiene color, promediamos entre ambos como antes
90% de intensidad
sin anti-aliasing
con anti-aliasing
Anti-aliasing de contornos
Cuando el aliasing se produce en un contorno que separa dos zonas de color diferente (aristas de un polgono relleno) aliasing de contornos La solucin consiste en incorporar las tcnicas anteriores a los algoritmos de scan-line Area-sampling: Segn el rea de polgono que caiga dentro de cada pixel de la frontera, determinamos el color final Super-sampling: Aadimos ms scan-lines en la imagen virtual que le pasamos al algoritmo de relleno decidimos el color de los pixels frontera en funcin de dnde acabe cada scan-line
rea-sampling
Super-sampling
color =
A1 ( verde ) + A2 ( amarillo ) A1 + A2
A2 A1 color