Dibujo de un píxel, cálculo de la AND, OR y NOTdccia.ua.es/dccia/inf/asignaturas/GC/Teoria/Tema...

25
Tema 3

Transcript of Dibujo de un píxel, cálculo de la AND, OR y NOTdccia.ua.es/dccia/inf/asignaturas/GC/Teoria/Tema...

Tem

a 3

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

4

3.2 Líneas

Píxel actual

Píxel siguiente

M0

E

NE

M2

M1

Q

P

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

6

3.3 Círculos

Píxel siguiente

M0

E

SE

M1

M2

Q

P

Píxel actual

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

10

3.4 Elipses

a

-b

-a

b

m

m

Región 1

Región 2

Gradiente

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

15

3.7 Antialising

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

Tem

a 3: P

rim

itiva

s de S

alida

3.8 Relleno de Primitivas

Relleno Semilla Iterativo

Una vez rellenada la línea entre xi y xd, se buscan nuevos puntos

semilla, sin sobrepasar dichos límites, en la línea superior e

inferior, siguiendo el criterio de punto candidato a semilla.

24

S1

S2