Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
• INTRODUCCION
• PRIMITIVAS GRAFICAS
• ESPECIFICACION DE UNA
DISCRETIZACION
• DIBUJO DE LINEAS RECTAS
• ALGORITMOS PARA CIRCULOS
Introducción
• En los sistemas raster, las imágenes vienen definidas por la intensidad de sus
pixels
Introducción
• Los objetos presentes en la imagen se componen de primitivas simples (líneas,
puntos)
• El sistema gráfico dibuja estas primitivas transformándolos en pixels ->
Rasterización
• No es muy eficiente
• Cada paso requiere una multiplicación
flotante, una suma y un redondeo
Función usando la ecuación
void Ecuacion(int x0, int y0, int x1, int y1)
{
int dx=x1-x0,dy=y1-y0;
putpixel(x0,y0,BLUE);
float m=(float)dy/dx;
float b= y0-m*x0;
if(dx<0) dx=-1 else dx=1;
while(x0 != x1)
{
x0 +=dx;
y0=ceil(m*x0+b);
putpixel(x0,y0,BLUE);
}
}
Función mejorada
void Ecuacion(int x0, int y0, int x1, int y1)
{
int dx=x1-x0,dy=y1-y0;
putpixel(x0,y0,BLUE);
else
if(abs(dx)>abs(dy))
{
{
float m=(float)dx/dy;
float m=(float)dy/dx;
float b= x0-m*y0;
float b= y0-m*x0;
if(dy<0) dy=-1 else dy=1;
if(dx<0) dx=-1 else dx=1;
while(y0 != y1)
while(x0 != x1)
{
{
y0 +=dy;
x0 +=dx;
x0=ceil(m*y0+b);
y0=ceil(m*x0+b);
putpixel(x0,y0,BLUE);
putpixel(x0,y0,BLUE);
}
}
}
}
}
Algoritmo Básico Incremental DDA
• Podemos eliminar la multiplicación de la siguiente manera:
– Sabemos que
yi = mxi + b
– Entonces el siguiente valor sera:
yi+1 = mxi+1 + b
– Reemplazando el valor xi+1= xi +x se tiene:
yi+1=m(xi +x)+ b
– Multiplicando y reemplazando :
yi+1= mxi + b + mx
yi+1= yi + mx
– Como Δx =1, llegamos a la fórmula final
yi+1 = yi + m
• Cada pixel se calcula en función del anterior
• No hace falta calcular b
DDA donde m<1
Funcion Linea_DDA(int x0, y0, x1, y1)
inicio
dx = x1-x0
dy = y1- y0
m =(float) dy/dx
m <1, los pasos son a y = y0
largo de ‘x’. Para x=x0 hasta x1 hacer
Pintar Pixel(x,y)
x=x+1
y=y+m
Fin para
fin
Algoritmo Básico Incremental DDA
Si m>1 falla, pues quedan huecos, como se muestra
Solución:
Intercambiamos las variables x e y, sabemos que:
xi = (1/m) (yi – b)
xi+1 = xi + 1/m
DDA donde m>1
Funcion Linea_DDA(int x0, y0, x1, y1)
inicio
dx = x1-x0
dy = y1- y0
m >1, los pasos no son m = (float)dy/dx
en x. Para manejar esto, x = x0
cambiar ‘x’ por ‘y’. Para y=y0 hasta y1 hacer
Pintar Pixel(x,y)
x=x+1/m
y=y+1
Fin para
fin
Algoritmo Básico Incremental DDA
Funcion Linea_DDA(int x0, y0, x1, y1)
inicio
dx = x1-x0
dy = y1- y0
Si abs(dx) > abs(dy) entonces steps = abs(dx)
• Inconvenientes:
sino steps = abs(dy) – Existen errores de
xinc =dx / steps acumulación
yinc =dy / steps – El redondeo es muy lento
x = x0
y = y0
para k=1 hasta steps hacer
Pintar Pixel(x,y)
x=x+xinc
y=y+yinc
fin para
fin
Funcion para lineas con DDA
void Dda(int x0, int y0, int x1, int y1)
{
float x, y, xs, ys;
int dx, dy, steps;
dx = x1 - x0; dy = y1 - y0;
x = x0; y = y0;
if (abs(dx) > abs(dy)) steps = abs(dx); else steps = abs(dy);
if (steps == 0) {
putpixel( x, y,BLUE);
return;
}
xs = dx/steps; ys = dy/steps;
for (i = 0; i <= steps; i++)
{
putpixel( x, y,BLUE);
x = x + xs; y = y + ys;
}
}
Algoritmo de Bresenham
• Sólo usa aritmética entera
• Supongamos el caso 0 < m < 1 hay que decidir
qué pixel dibujamos a continuación, y
¡ sólo hay dos candidatos !
donde C = 2 Δy + Δx (2b – 1)
Algoritmo de Bresenham
• Como Δx > 0, el signo de pk coincide con el de la diferencia (d1 – d2), y por
tanto:
Si pk > 0 d1 > d2
hay que pintar el pixel (xk+1, yk+1)
Si pk < 0 d1 < d2
hay que pintar el pixel (xk+1, yk)
Algoritmo de Bresenham
• La gran ventaja es que puede calcularse pk+1 a partir del anterior
pk = 2 Δy xk - 2 Δx yk + c
utilizando solamente ¡aritmética entera!.
• En el paso k + 1, el parámetro de decisión se evalúa con base en la ecuación
anterior como
pk+1 = 2 Δy xk+1 - 2 Δx yk+1 + c
• Al sustraer la ecuación de la anterior pk obtenemos
pk+1 - pk = 2 Δy xk+1 - 2 Δx yk+1 + c-2 Δy xk + 2 Δx yk - c
pk+1 - pk = 2 Δy (xk+1 - xk) - 2 Δx( yk+1 - yk)
• Si pk < 0 d1 < d2
hay que pintar el pixel (xk+1, yk) encontes yk+1 = yk
pk+1 = pk + 2 Δy – 2 Δx (yk – yk)
pk+1 = pk + 2 Δy
Algoritmo de Bresenham
•El primer parámetro p0 se evalúa a partir de la ecuación pk
pk = Δx (2 (Δy / Δx) (xk + 1) - 2 yk + 2 b - 1)
en la posición (x0,y0),
sustituyendo con b = y0 - m x0 y
m = Δy / Δx.
p0 = Δx (2( Δy / Δx)(x0 + 1) - 2 y0 + 2 (y0 - (Δy / Δx) x0) - 1)
p0 = 2 Δy x0 + 2 Δy - 2 Δx y0 + 2 Δx y0 - 2 Δy x0 - Δx
•donde se obtiene la siguiente ecuación:
p0 = 2 Δy - Δx
Algoritmo de Bresenham
• Si m > 1, intercambiamos
las variables x e y
• Si m < 0, el cambio es
similar
Algoritmo de Bresenham
void Bresenham(int x0, int y0, int x1, int y1)
{
if(dx>dy){ else{
int x, y, dx, dy, p;
p = 2*dy - dx; p = 2*dx - dy;
int incE, incNE, stepx, stepy; incE = 2*dy; incE = 2*dx;
dx = (x1 - x0); dy = (y1 - y0); incNE = 2*(dy-dx); incNE = 2*(dx-dy);
if (dy < 0) while (x != x1){ while (y != y1){
{ x = x + stepx; y = y + stepy;
if (p < 0){ if (p < 0){
dy = -dy; stepy = -1;
p = p + incE; p = p + incE;
} else stepy = 1; } }
if (dx < 0) else { else {
{ y = y + stepy; x = x + stepx;
dx = -dx; stepx = -1; p = p + incNE; p = p + incNE;
} }
} else stepx = 1;
putpixel( x, y,BLUE); putpixel( x, y,BLUE);
x = x0; y = y0; } }
putpixel( x0, y0,BLUE); } }
}
Algoritmo del Punto Medio
• Bresenham, J.E. "Algorithm for Computer Control of a Digital Plotter". IBM
Systems Journal, 4(1), 1965, 25-30.
• Usa aritmética entera
• Supone la pendiente (m) en el rango [0, 1]
• Parte del punto inferior-izquierdo al punto superior-derecho
Algoritmo del Punto Medio
• Segmento de recta desde (x0, y0) a (xf, yf)
(x, y) : centro de un pixel
• y + e : valor exacto de la ordenada de la recta
• e : error (distancia) a la ordenada del pixel; e [-0.5, 0.5]
• m : pendiente de la recta
Algoritmo del Punto Medio
Qué pixel pintar (x+1, y) o (x+1, y+1) ?
Si y + e + m < y + 0.5 entonces se dibuja (x+1, y)
Para (x+1, y), el nuevo valor de ‘e’ será:
e = (y + e + m) – y
e = e+m
(x - xc)2 + (y - yc) 2 = r2
Algoritmo básico
Círculo en el origen: X 2 + Y 2 = R 2
>0
• El algoritmo de Bresenham evita los SE
cálculos de raíces cuadradas. MSE =0
<0
• Utiliza un parámetro de decisión para
determinar cual de las dos posiciones
Píxel Opciones Opciones
posibles de y esta mas próxima a la
anterior para Píxel para Píxel
actual siguiente
trayectoria de la circunferencia.
• Sea la función:
• Este test lo ejecutaremos en los puntos medios entre los píxel que hay que
decidir
Algoritmo del Punto Medio
Mecanismo de elección del píxel a pintar:
• Uso de P (referencia)
Coordenadas de P ??
Algoritmo del Punto Medio
• Supongamos ya dibujado el píxel (xk, yk)
pk = f (xk+1, yk – ½) = (xk+1)2 + (yk – ½) 2 – R2
• Si las distancias de los dos focos desde cualquier punto P=(x,y) en la elipse se
representan como d1 y d2, entonces la ecuación general de una elipse puede
expresarse como
d1 + d2 = constante
ALGORITMO BASICO
• Las ecuaciones de la elipse se simplifican, en gran medida, si se orientan los
ejes mayor y menor para alinearse con los ejes de las coordenadas, como se
muestra en la siguiente figura.