Tem
a 3: P
rim
itiva
s de S
alida
1
Dibujo de un píxel, cálculo de la
posición de memoria
Cálculo del bit, máscara, operaciones
AND, OR y NOT
Modos CGA, EGA, VGA, SVGA, etc…
Optimización de operaciones
Tarjetas actuales comandos y
ejecución por hardware
3.1 Punto
Tem
a 3: P
rim
itiva
s de S
alida
2
3.2 Líneas
a) Algoritmo Básico Incremental
Función explícita de la línea:
y=mx+B
Algoritmo basado en DDA (Digital differential
Analizer)
Si se emplea coma flotante y redondeos,
poco eficiente
Si se emplea enteros problemas de
continuidad
Tem
a 3: P
rim
itiva
s de S
alida
3
3.2 Líneas
b) Algoritmo del punto medio (Bresenham)
• Se basa en el empleo de la función implícita:
• F(x,y)=ax+by+c=0
• Si F(x,y)=0 el punto está en la recta
• Si F(x,y)>0 el punto está encima de la recta
• Si F(x,y)<0 el punto está debajo de la recta
• Hacemos el análisis para rectas de 45º o
pendiente igual a uno (m=1), y luego lo
extendemos a cualquier pendiente
45º
m=1
Tem
a 3: P
rim
itiva
s de S
alida
5
3.3 Círculos
Algoritmo del punto medio (Bresenham)
• Se basa en el empleo de la función implícita:
• F(x,y)=x2+y 2-R2=0
• Si F(x,y)=0 el punto está en la curva del círculo
• Si F(x,y)>0 el punto está encima de la curva
• Si F(x,y)<0 el punto está debajo de la curva
• Hacemos el análisis para un octante de 0 a
x=y, y hacemos simetrías de ocho puntos
Tem
a 3: P
rim
itiva
s de S
alida
7
3.3 Círculos
Primera implementación (1as diferencias)void circulo(int radio) {
int x,y;
float d;
x=0;
y=radio;
d=5/4-radio;
OchoPuntos(x,y);
Tem
a 3: P
rim
itiva
s de S
alida
8
3.3 Círculos
while (y>x) {
if (d<0) {
d+=2*x+3;
x++;
} else {
d+=2*(x-y)+5;
x++;
y—-;
}
OchoPuntos(x,y);
}
}
Tem
a 3: P
rim
itiva
s de S
alida
9
3.4 Elipses
Algoritmo del punto medio (Bresenham)
• Se basa en el empleo de la función implícita:
• F(x,y)=b2x2+a2y 2-a2b2=0
• Si F(x,y)=0 el punto está en la curva del círculo
• Si F(x,y)>0 el punto está encima de la curva
• Si F(x,y)<0 el punto está debajo de la curva
• Hacemos el análisis para un cuadrante (2
regiones), y hacemos simetrías de cuatro puntos
Tem
a 3: P
rim
itiva
s de S
alida
11
3.5 Otras Curvas
Algoritmo del punto medio (Bresenham)
• Se basa en el empleo de la función implícita:
• F(x,y )=Ax2+By 2+Cxy+Dx+Ey+F=0
• Examinando el discriminante:
• B2-4AC
hiperbolas generamos 0
parábolas generamos 0
elipses generamos 0
Tem
a 3: P
rim
itiva
s de S
alida
12
3.6 Atributos de Primitivas
Se basa en el uso de la brocha (Brush) y
lápiz (Pen)
1. Color (R,G,B)
2. Grosor
3. Estilo
4. Terminaciones
5. Patrón de relleno
• Pixmap
• Bitmap
Tem
a 3: P
rim
itiva
s de S
alida
13
3.7 Otras primitivas
Rectángulos, Polígonos … (son líneas)
Texto:
• Bitmaps: mapas de bits
• Vectoriales (TrueType, OpenType): combinación de
curvas de bezier, polilíneas y algoritmos de relleno
• Atributos especiales:
• Tipo de letra (Arial, Courier, Times New Roman …)
• Tamaño (puntos)
• Modificadores (negrita, itálica, superíndice, subrayada…)
Tem
a 3: P
rim
itiva
s de S
alida
14
3.7 Antialising
Sobremuestreo de puntos
Se dibuja sobre un raster virtual de 4x4 o 9x9 y
luego se suma y se hace el promedio de cada zona
para calcular el píxel final, con el % del color
original
Aceleración por hardware, suma ponderada de los
pesos de los píxeles (postproceso)
Raytracing (lanzar más de 1 rayo por píxel)
Tem
a 3: P
rim
itiva
s de S
alida
16
3.8 Relleno de Primitivas
Tipo Vectorial
• Rectángulos, Círculos, Elipses, etc.
• Algoritmo General de Polígonos
Tipo Raster
• Regiones y Áreas 4 y 8 Conectadas
• Semilla recursivo
• Semilla iterativo
Tem
a 3: P
rim
itiva
s de S
alida
3.8 Relleno de Primitivas
Rectángulos
Para el relleno de rectángulos empleamos el
relleno de memoria de video con funciones del
estilo a:• void *memset(void *s, int c, size_t n);
• donde s es un puntero a la memoria, c el valor a rellenar
y n el número de bytes a rellenar.
Nunca se emplea la función línea de Bresenham
puesto que ésta es muy ineficiente y la idea es
aprovechar al máximo las coherencias, debemos
epmlear máscaras para el borde derecho e
izquierdo y relleno de bytes completos para el
interior.
17
Tem
a 3: P
rim
itiva
s de S
alida
3.8 Relleno de Primitivas
Círculos
La idea para rellenar círculos es bien sencilla, en
vez de dibujar 8 puntos rellenamos 4 líneas.
18
Para hacerlo correctamente debemos
evitar pintar cada píxel más de una
vez, puesto que si hacemos
operaciones binarias, se hará mal, por
ejemplo en el caso de un XOR
Tem
a 3: P
rim
itiva
s de S
alida
3.8 Relleno de Primitivas
Elipses
En este caso, en vez de dibujar 4 puntos
rellenamos 2 líneas.
19
Aquí debemos evitar también
pintar más de una vez un píxel,
hay que estudiar los casos
particulares
Región 1
Región 2
Tem
a 3: P
rim
itiva
s de S
alida
3.8 Relleno de Primitivas
Polígonos
Algoritmo General de Relleno de Polígonos
20
1 2 3 456
Tem
a 3: P
rim
itiva
s de S
alida
3.8 Relleno de Primitivas
Áreas y Fronteras
Las fronteras son zonas limitadas por un contorno
del mismo color
Las áreas son zonas donde los píxeles contiguos
son del mismo color
21
Frontera 4-Conectada Frontera 8-Conectada
Área 8-Conectada Área 4-Conectada
Tem
a 3: P
rim
itiva
s de S
alida
3.8 Relleno de Primitivas
Relleno Semilla Recursivo
El relleno recursivo comprueba un pixel y si no está relleno
lo pinta y hace 4 u 8 llamadas recursivas a los píxeles
adyacentes, sencillo pero muy ineficiente
22
Área 4-Conectada
void Rellenar(int x, int y,
color cf, color cr)
{
if (LeerPixel(x, y) == cf) {
PintarPixel(x, y, cr);
Rellenar(x, y+1, cf, cr);
Rellenar(x, y-1, cf, cr);
Rellenar(x+1, y, cf, cr);
Rellenar(x-1, y, cf, cr);
}
}
Tem
a 3: P
rim
itiva
s de S
alida
3.8 Relleno de Primitivas
Relleno Semilla Iterativo
El relleno iterativo aprovecha las distintas coherencias al
máximo, y evita la pila recursiva con una pila propia que
rellena de forma más “inteligente”
23
Fro
ntera 8
-C
onec
ta
da