Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema 2 - Primitivas 2D
Tema 2 - Primitivas 2D
ndice
1.
2.
3.
2.
Algoritmo de Bresenham
3.
2.
Algoritmos de Relleno
1.
2.
4.
5.
Tcnicas de Anti-aliasing
1.
Super-sampling
2.
Area Sampling
3.
Anti-aliasing de contornos
Primitivas 2D
En los sistemas raster, las imgenes vienen definidas por la intensidad de sus pixels
aplicacin
controlador
grfico
controlador
de vdeo
Primitivas 2D
Fila i
0xFF
0xFF
0xFF
0x00
0x85
0x00
0xFF
0xFF
Memoria
de vdeo
Cuando el haz de electrones pase por esa lnea horizontal (scan-line), emitir al pasar por esa
posicin
Para dibujar lneas rectas, habr que calcular las posiciones intermedias entre los dos
extremos
Sin embargo, las posiciones de los pixels son valores enteros, y los puntos obtenidos de
la ecuacin son reales existe un error (aliasing)
Hay que calcular las coordenadas de los pixels que estn lo ms cerca posible de una
lnea recta ideal, infinitamente delgada, superpuesta sobre la matriz de pixels.
las lneas deben dibujarse con el mismo grosor e intensidad independientemente de su inclinacin
correcto
incorrecto
El algoritmo ms sencillo
La ecuacin de una recta es
m es la pendiente
P1
y = mx + b
y1
y0
P0
y y1 y 0
=
x x1 x0
Calcular
m=
Calcular
b = y 0 mx0
x0
x1
No es muy eficiente
Inconvenientes:
Existen errores de
acumulacin
El redondeo es muy
lento
Algoritmo de Bresenham
yk+1
yk
xk xk+1
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
yk
xk
xk+1
d2
d2 = (yk + 1 y) = yk + 1 - m (xk+ 1) - b
d1
d1 = y yk = m (xk+ 1) + b - yk
Algoritmo de Bresenham
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:
yk+1
d2
d1
yk
xk
xk+1
Algoritmo de Bresenham
Funcion Bresenham (int x0, y0, x1, y1)
// slo para el caso 0 < m < 1, siendo x0 < x1
Si m > 1, intercambiamos
las variables x e y
Si m < 0, el cambio es
similar
Ejemplo
P0 = (20, 10)
P1 = (30, 18)
x = 10
y = 8
p0 = 6
2y = 16
2y - 2x = -4
I(0,0) = FB[0]
I(x+1,y) = I(x,y) + 1
ymax
xmax
Fila 0
(1,0)
(2,0)
(xmax-1,0)
(0,1)
(0,2)
Fila 1
(0,0)
Frame
Buffer
Solucin:
Tipos de lnea
Solucin:
Grosor de lnea
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
Butt cap
Round cap
Projected cap
Miter join
Round join
Bend join
Dibujo de circunferencias
(xc,yc)
R
Calcular
y = y 0 R 2 ( x x0 ) 2
No es nada eficiente
Otra forma
x = xc + R cos t
y = yc + R sin t
t=/2
(xc,yc)
t=
t=0
R
2
1
t=3/2
2
1
Sea la funcin:
< 0 (x,y) est dentro
f(x,y) = x2 + y2 R2
Por lo tanto:
Si pk > 0 pk+1 = pk + 2xk+1 - 2yk+1 + 1 hay que pintar el pixel (xk+1, yk-1)
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
Al copiar al resto de octantes hay que tener en cuenta la secuencia del interespaciado
Grosor de lnea
Existen 3 mtodos:
1.
Pintando secciones horizontales o verticales segn sea la pendiente mayor o menor que 1
2.
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
3.
Relleno de primitivas
Dada un rea cerrada, hay que ser capaz de rellenar los pixels interiores con un color
determinado
Relleno de primitivas
1.
2.
x0
x1
x2
x3
Cmo lo solucionamos?
Cmo detectarlo?
En lugar de calcular para cada scan-line las intersecciones contodos las aristas del
polgono, podemos ir aprovechando el clculo en cada scan-line anterior
La pendiente de la arista es
m = (yk+1 yk) / (xk+1 - xk)
Primero hay que crear una tabla de bordes (TB), para todas las aristas del polgono
(exceptuando las horizontales)
Inversa de la pendiente
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
El algoritmo va testeando los pixels vecinos a los ya pintados, viendo si son frontera o no
No slo sirven para polgonos, sino para cualquier rea curva sobre una imagen se usan
en los programas de dibujo
El algoritmo se presta a un
esquema recursivo muy
simple
ahorran ms memoria
Tcnicas anti-aliasing
Soluciones hardware:
Imagen digitalizada
Super-sampling
Una vez calculada la recta para los subpixels, determinamos el color del pixel real
Para dibujar una recta, contamos el nmero de subpixels que estn sobre la lnea
33%
66%
100%
Bresenham en pixels
Bresenham en subpixels
66%
33%
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
Area-sampling
La intensidad del pixel viene dada por el rea de interseccin entre cada pixel y el
objeto que se va a dibujar
Lo que hacemos es testear una malla de puntos interiores al pixel y calcular cuntos
caen dentro del rectngulo mtodo de integracin de Montecarlo
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
Area-sampling: Segn el rea de polgono que caiga dentro de cada pixel de la frontera,
determinamos el color final
rea-sampling
Super-sampling
color =
A1 ( verde ) + A2 ( amarillo )
A1 + A2
A2
A1
color