Вы находитесь на странице: 1из 23

Computacin Grfica

Segmento de recta
Dado los puntos extremos de un segmento: Cmo identificar los
pixeles que lo representan?

Segmento de recta: Bresenham


Definicin
Un eficiente algoritmo para dibujar una lnea en una
pantalla raster (compuesta de pixeles).

Referencia
Bresenham, J.E. "Algorithm for Computer Control of a
Digital Plotter". IBM Systems Journal, 4(1), pp. 25-30,
1965.

Segmento de recta: Bresenham


Caractersticas:
Usa aritmtica entera
Supone la pendiente (m) en el rango [0, 1]
Parte del punto inferior-izquierdo al punto superiorderecho

Segmento de Recta

Ecuacin de la recta:
y = f(x) = mx+c

Puntos de la recta (valor exacto):


(x, f(x)) = (x, mx + c)

Punto de la recta (valor en pantalla):


(x, round(f(x))) = (x, round(mx+c))

Segmento de recta

Punto de la recta:

Punto de la pantalla:

Segmento de recta

Dado que
x = x + x
y = m * x + b
y = m * x + b
Luego
y = m * x + b
y = m * (x + x) + b
= m * x + m * x + b
Pero
x = x - x = 1 ; distancia unitaria
Luego
y = m * x + b + m
y = y + m

Segmento de recta: Bresenham


Segmento de recta desde (x0, y0) a (xf, yf)
(x, y) : centro de un pixel
: error (distancia) a la ordenada del pixel
[-0.5, 0.5]
y + : valor exacto de la ordenada de la recta
m : pendiente de la recta

Segmento de recta: Bresenham


Segmento de recta desde (x0, y0) a (xf, yf)
(x, y) : centro de un pixel
: error (distancia) a la ordenada del pixel
[-0.5, 0.5]
y + : valor exacto de la ordenada de la recta
m : pendiente de la recta

y+

y+
+ m
}

}m

+
m

Segmento de recta: Bresenham


Qu pixel pintar (x+1, y) o (x+1, y+1) ?
Si y + + m < y + 0.5 entonces se dibuja (x+1, y),
de lo contrario se dibuja (x+1, y+1)
Para (x+1, y), el nuevo valor de ser:
(y + + m) - y

=+m

Para (x + 1, y + 1), el nuevo valor de ser:

(y + + m) - (y + 1)

=+m-1

Segmento de recta: Bresenham


seudo algoritmo 1:
0
y y1
para x x1 hasta x2
setPixel (x, y)

si + m < 0.5
+ m
sino
y y +1
+m - 1

La pendiente (m) es
un valor no entero!!

Segmento de recta: Bresenham

Dado que m = dx / dy, entonces


+ m < 0.5
+ dy / dx < 0.5
; multiplicando por 2 dx
2 dx + 2 dy < dx

Sustituyendo dx por , el test pasa a ser:


2( + dy) < dx

Segmento de recta: Bresenham


Para la actualizacin del error tenemos:
+ m
+ m 1

multiplicando por dx:


dx dx + dy
dx dx + dy dx

y sustituyendo dx por :
+ dy
+ dy - dx

Segmento de recta: Bresenham


seudo algoritmo 2:

0
y y1
para x x1 hasta x2
setPixel (x, y)
si 2( + dy) < dx
+ dy
sino
y y + 1
+ dy - dx

Slo valores enteros!

Segmento de recta: Bresenham


El algoritmo en C:
void linea (unsigned x1, unsigned y1,
unsigned x2, unsigned y2) {
int dx = x2 x1, dy = y2 y1,
y = y1, eps = 0, x;
for (x = x1; x <= x2; x++) {
setpixel(x, y);
eps += dy;
if ((eps << 1) >= dx) {

y++; eps = dx;


}
}
}

Simetra

Para Bresenham en pendientes distintas al rango [0, 1] se usa simetra:

(x, y)
o
45

Bresenham
en rango [0,1]

Simetra

Para Bresenham en pendientes distintas al rango [0, 1] se usa simetra:

(x, y)
o
45

Simetra
en eje X

(x, -y)

Simetra

Para Bresenham en pendientes distintas al rango [0, 1] se usa simetra:

Simetra
en eje Y

(-x, y)

(x, y)
o
45

Simetra

Para Bresenham en pendientes distintas al rango [0, 1] se usa simetra:

(y, x)

Simetra
en eje de 45o

(x, y)
o
45

Simetra

Para Bresenham en pendientes distintas al rango [0, 1] se usa simetra:

(-y, x)

Repitiendo
se llega a:

(y, x)

(-x, y)

(x, y)
o
45

(x, -y)

(-x, -y)

(-y, -x)

(-y, x)

Simetra

Observacin:

Bajo simetra en X, se cambia de signo la abscisa: (x, y) pasa a ser (x, -y)

Bajo simetra en Y, se cambia de signo la ordenada: (x, y) pasa a ser (-x, y)

Bajo simetra de 45o, abscisa y ordenada se intercambian: (x, y) pasa a ser (y, x)

Simetra

Valor de la pendiente en cada sector

y0 < y
infinito < m < -1

y0 < y
1 < m < infinito

x < x0
-1 <= m <= 0

x0 < x
0 <= m <= 1
45o

0 < m <= 1
x < x0

1 < m < infinito


y < y0

(x0, y0)

-1 <= m < 0
x0 < x

-infinito < m < -1


y < y0

Bresenham

Bresenham para cualquier pendiente puede ser implementado usando la


implementacin de la pendiente en rango [0, 1]

Hay que analizar la pendiente de la recta

Hay que analizar la posicin de (x, y) c/r a (x0, y0)

Luego, hay que cambiar los signos de abscisa y ordenada y / o intercambiar abscisa
por ordenada

Propuesto!!

Вам также может понравиться