Primitivas Gráficas - Algoritmo BRESENHAM para Líneas
En este post explicaré el algoritmo para lineas BRESENHAM en 2D:
DEFINICIÓN
- Algoritmo preciso y efectivo para la generación de líneas de rastreo.
- Con el apoyo de un parámetro de decisión, elige de entre dos pixeles el que más se acerca a la trayectoria de la recta.
- Dado un punto (xk, yk), se predice el punto (xk+1, yk+1), teniendo en cuenta el parámetro de decisión pk.
DEMOSTRACIÓN
Consideraciones previas
Una recta es la representación de un lugar geométrico definido por:
y = mx + b ... (1)
Dicho lugar geométrico tiene extremos (x0, y0) y (xf, yf):
m=(yf - y0)/(xf - x0)
m=∆y/∆x ...(2)
m=∆y/∆x ...(2)
De donde:
y = (∆y/∆x)x + b ...(3)
0<m<1
Tenemos:
(xk, yk)
(xk + 1, yk) o (xk + 1, yk + 1)
Para elegir el píxel correcto, medimos la distancia de la recta a esos dos puntos:
d1 = y - yk = m(xk + 1) + b - yk
d2 = (yk+1) - y = yk + 1 - m(xk + 1) - b
d1 - d2 = 2m(xk + 1) - 2yk + 2b - 1
El parámetro de decisión pk indica el paso k en el algoritmo.
pk =∆x(d1 - d2)
pk =∆x(d1 - d2)
pk =∆x(2m(xk + 1) - 2yk + 2b - 1)
pk =∆x(2m(xk + 1) - 2yk + 2b - 1)
pk =∆x(2(∆y/∆x)(xk + 1) - 2yk + 2b - 1)
pk = 2∆y(xk + 1) - 2∆xyk + 2∆xb - ∆x
pk = 2∆yxk + 2∆y - 2∆xyk + 2∆xb - ∆x
pk = 2∆yxk - 2∆xyk + 2∆y + 2∆xb - ∆x
pk = 2∆yxk - 2∆xyk + C
pk = 2∆yxk - 2∆xyk + C
Donde:
- pk tiene el signo de d1 - d2
- xf > x0
- C=2∆y+2∆xb-∆x (Independiente del pixel)
- yk está más cerca de la trayectoria de la recta
- pk es negativo
- yk+1 está más cerca de la trayectoria de la recta
- pk es positivo
pk+1 = 2∆yxk+1 - 2∆xyk+1 + C
Al sustraer pk:
pk+1 - pk = 2∆y(xk+1 - xk) - 2∆x(yk+1 - yk)
Si xk+1 = xk + 1
pk+1 - pk = 2∆y(xk+1 - xk) - 2∆x(yk+1 - yk)
pk+1 - pk = 2∆y(xk + 1 - xk) - 2∆x(yk+1 - yk)
pk+1 - pk = 2∆y - 2∆x(yk+1 - yk)
pk+1 = pk + 2∆y - 2∆x(yk+1 - yk)
De donde:- Si yk+1 = yk + 1
pk+1 = pk + 2∆y - 2∆x
- Si yk+1 = yk
pk+1 = pk + 2∆y
Esto depende del parámetro p0:
pk = 2∆yxk - 2∆xyk + 2∆y + 2∆xb - ∆x
p0 = 2∆yx0 - 2∆xy0 + 2∆y + 2∆xb - ∆x
De la ecuación 3 despejo b:
y0 = (∆y/∆x)x0 + b
b = y0 - (∆y/∆x)x0 ...(4)
Reemplazo en p0:
p0 = 2∆yx0 - 2∆xy0 + 2∆y + 2∆xb - ∆x
p0 = 2∆yx0 - 2∆xy0 + 2∆y + 2∆x(y0 - (∆y/∆x)x0) - ∆x
Resolviendo la ecuación:
p0 = 2∆y - ∆x
Finalmente, para este caso tenemos:
p0 = 2∆y - ∆x
Si pk < 0
- Trazar (xk+1, yk)
- pk+1 = pk + 2∆y
Caso contrario
- Trazar (xk+1, yk + 1 )
- pk+1 = pk + 2∆y - 2∆x
-1<m<0
Tenemos:
(xk, yk)
(xk + 1, yk) o (xk + 1, yk - 1)
Para elegir el píxel correcto, medimos la distancia de la recta a esos dos puntos:
d1 = y - yk+1 = m(xk + 1) + b - (yk - 1) = m(xk + 1) + b - yk + 1
d2 = yk - y = yk - m(xk + 1) - b
d1 - d2 = 2m(xk + 1) - 2yk + 2b + 1
El parámetro de decisión pk indica el paso k en el algoritmo.
pk =∆x(d1 - d2)
pk =∆x(d1 - d2)
pk =∆x(2m(xk + 1) - 2yk + 2b + 1)
pk =∆x(2m(xk + 1) - 2yk + 2b + 1)
pk =∆x(2(∆y/∆x)(xk + 1) - 2yk + 2b + 1)
pk = 2∆y(xk + 1) - 2∆xyk + 2∆xb + ∆x
pk = 2∆yxk + 2∆y - 2∆xyk + 2∆xb + ∆x
pk = 2∆yxk - 2∆xyk + 2∆y + 2∆xb + ∆x
pk = 2∆yxk - 2∆xyk + C
pk = 2∆yxk - 2∆xyk + C
Donde:
- pk tiene el signo de d1 - d2
- xf > x0
- C=2∆y+2∆xb+∆x (Independiente del pixel)
- yk - 1 está más cerca de la trayectoria de la recta
- pk es negativo
- yk está más cerca de la trayectoria de la recta
- pk es positivo
pk+1 = 2∆yxk+1 - 2∆xyk+1 + C
Al sustraer pk:
pk+1 - pk = 2∆y(xk+1 - xk) - 2∆x(yk+1 - yk)
Si xk+1 = xk + 1
pk+1 - pk = 2∆y(xk+1 - xk) - 2∆x(yk+1 - yk)
pk+1 - pk = 2∆y(xk + 1 - xk) - 2∆x(yk+1 - yk)
pk+1 - pk = 2∆y - 2∆x(yk+1 - yk)
pk+1 = pk + 2∆y - 2∆x(yk+1 - yk)
De donde:- Si yk+1 = yk - 1
pk+1 = pk + 2∆y + 2∆x
- Si yk+1 = yk
pk+1 = pk + 2∆y
Esto depende del parámetro p0:
pk = 2∆yxk - 2∆xyk + 2∆y + 2∆xb + ∆x
p0 = 2∆yx0 - 2∆xy0 + 2∆y + 2∆xb + ∆x
Reemplazo en p0 por la ecuación (4):
p0 = 2∆yx0 - 2∆xy0 + 2∆y + 2∆xb + ∆x
p0 = 2∆yx0 - 2∆xy0 + 2∆y + 2∆x(y0 - (∆y/∆x)x0) + ∆x
Resolviendo la ecuación:
p0 = 2∆y + ∆x
Finalmente, para este caso tenemos:
p0 = 2∆y + ∆x
Si pk < 0
- Trazar (xk+1, yk - 1)
- pk+1 = pk + 2∆y + 2∆x
Caso contrario
- Trazar (xk+1, yk)
- pk+1 = pk + 2∆y
1<m
(xk, yk)
Los posibles puntos a pintar serian:
(xk, yk + 1) o (xk + 1, yk + 1)
Para elegir el píxel correcto, medimos la distancia de la recta a esos dos puntos:
d1 = x - xk = (yk + 1 - b)/m - xk
d2 = xk+1 - x = xk + 1 - (yk + 1 - b)/m
d1 - d2 = 2(yk + 1 - b)/m - 2xk - 1
El parámetro de decisión pk indica el paso k en el algoritmo.
pk =∆y(d1 - d2)
pk =∆y(d1 - d2)
pk =∆y(2(yk + 1 - b)/m - 2xk - 1)
pk =∆y(2(yk + 1 - b)/m - 2xk - 1)
pk =∆y(2(yk + 1 - b)/(∆y/∆x) - 2xk - 1)
pk =∆y(2(yk + 1 - b)/(∆y/∆x) - 2xk - 1)
pk =∆y(2∆x(yk + 1 - b)/∆y - 2xk - 1)
pk =2∆x(yk + 1 - b) - 2∆yxk - ∆y
pk =2∆xyk + 2∆x - 2∆xb - 2∆yxk - ∆y
pk =2∆xyk - 2∆yxk + 2∆x - 2∆xb - ∆y
pk =2∆xyk + 2∆x - 2∆xb - 2∆yxk - ∆y
pk =2∆xyk - 2∆yxk + 2∆x - 2∆xb - ∆y
pk =2∆xyk - 2∆yxk + 2∆x - 2∆xb - ∆y
pk =2∆xyk - 2∆yxk + C
pk =2∆xyk - 2∆yxk + C
Donde:
- pk tiene el signo de d1 - d2
- yf > y0
- C=2∆x - 2∆xb - ∆y (Independiente del pixel)
- xk está más cerca de la trayectoria de la recta
- pk es negativo
- xk+1 está más cerca de la trayectoria de la recta
- pk es positivo
pk+1 =2∆xyk+1 - 2∆yxk+1 + C
Al sustraer pk:
pk+1 - pk = 2∆x(yk+1 - yk) - 2∆y(xk+1 - xk)
Si yk+1 = yk + 1
pk+1 - pk = 2∆x(yk+1 - yk) - 2∆y(xk+1 - xk)
pk+1 - pk = 2∆x(yk + 1 - yk) - 2∆y(xk+1 - xk)
pk+1 - pk = 2∆x - 2∆y(xk+1 - xk)
pk+1 = pk + 2∆x - 2∆y(xk+1 - xk)
De donde:pk+1 = pk + 2∆x - 2∆y(xk+1 - xk)
- Si xk+1 = xk + 1
pk+1 = pk + 2∆x - 2∆y
- Si xk+1 = xk
pk+1 = pk + 2∆x
Esto depende del parámetro p0:
pk =2∆xyk - 2∆yxk + 2∆x - 2∆xb - ∆y
p0 =2∆xy0 - 2∆yx0 + 2∆x - 2∆xb - ∆y
Reemplazo en p0 por la ecuación (4):
p0 =2∆xy0 - 2∆yx0 + 2∆x - 2∆xb - ∆y
p0 =2∆xy0 - 2∆yx0 + 2∆x - 2∆x(y0 - (∆y/∆x)x0) - ∆y
p0 =2∆xy0 - 2∆yx0 + 2∆x - 2∆x(y0 - (∆y/∆x)x0) - ∆y
Resolviendo la ecuación:
p0 = 2∆x - ∆y
Finalmente, para este caso tenemos:
p0 = 2∆x - ∆y
Si pk < 0
- Trazar (xk, yk + 1)
- pk+1 = pk + 2∆x
Caso contrario
- Trazar (xk+1, yk + 1)
- pk+1 = pk + 2∆x - 2∆y
m<-1
(xk, yk)
Los posibles puntos a pintar serian:
(xk, yk + 1) o (xk - 1, yk + 1)
Para elegir el píxel correcto, medimos la distancia de la recta a esos dos puntos:
pk =2∆yxk - 2∆xyk - 2∆x + 2∆xb + ∆y
d1 = xk - x = xk - (yk + 1 - b)/m
d2 = x - xk+1 = (yk + 1 - b)/m - xk + 1
d1 - d2 = 2xk - 2(yk + 1 - b)/m + 1
El parámetro de decisión pk indica el paso k en el algoritmo.
pk =∆y(d1 - d2)
pk =∆y(d1 - d2)
pk =∆y(2xk - 2(yk + 1 - b)/m +1)
pk =∆y(2xk - 2(yk + 1 - b)/m +1)
pk =∆y(2xk - 2(yk + 1 - b)/(∆y/∆x) +1)
pk =2∆yxk - 2∆y∆x(yk + 1 - b)/∆y + ∆y
pk =∆y(2xk - 2(yk + 1 - b)/(∆y/∆x) +1)
pk =2∆yxk - 2∆y∆x(yk + 1 - b)/∆y + ∆y
pk =2∆yxk - 2∆x(yk + 1 - b) + ∆y
pk =2∆yxk - 2∆xyk - 2∆x + 2∆xb + ∆y
pk =2∆yxk - 2∆xyk + C
pk =2∆yxk - 2∆xyk + C
Donde:
- pk tiene el signo de d1 - d2
- yf > y0
- C= - 2∆x + 2∆xb + ∆y(Independiente del pixel)
Si d1 < d2
- xk está más cerca de la trayectoria de la recta
- pk es negativo
- xk+1 está más cerca de la trayectoria de la recta
- pk es positivo
pk+1 =2∆yxk+1 - 2∆xyk+1 + C
Al sustraer pk:
pk+1 - pk = 2∆y(xk+1 - xk) - 2∆x(yk+1 - yk)
Si yk+1 = yk + 1
pk+1 - pk = 2∆y(xk+1 - xk) - 2∆x(yk+1 - yk)
pk+1 - pk = 2∆y(xk+1 - xk) - 2∆x(yk + 1 - yk)
pk+1 - pk = 2∆y(xk+1 - xk) - 2∆x
pk+1 = pk + 2∆y(xk+1 - xk) - 2∆x
De donde:pk+1 = pk + 2∆y(xk+1 - xk) - 2∆x
- Si xk+1 = xk
pk+1 = pk - 2∆x
- Si xk+1 = xk - 1
pk+1 = pk - 2∆y - 2∆x
Esto depende del parámetro p0:
pk =2∆yxk - 2∆xyk - 2∆x + 2∆xb + ∆y
p0 =2∆yx0 - 2∆xy0 - 2∆x + 2∆xb + ∆y
p0 =2∆yx0 - 2∆xy0 - 2∆x + 2∆xb + ∆y
Reemplazo en p0 por la ecuación (4):
p0 =2∆yx0 - 2∆xy0 - 2∆x + 2∆xb + ∆y
p0 =2∆yx0 - 2∆xy0 - 2∆x + 2∆x(y0 - (∆y/∆x)x0) + ∆y
Resolviendo la ecuación:
p0 = - 2∆x + ∆y
Finalmente, para este caso tenemos:
p0 = -2∆x + ∆y
Si pk < 0
- Trazar (xk, yk + 1)
- pk+1 = pk - 2∆x
Caso contrario
- Trazar (xk-1, yk + 1)
- pk+1 = pk - 2∆x - 2∆y
Casos Especiales
m=0
- Tenemos:
(xk, yk)
- El siguiente punto a pintar es:
(xk + 1, yk)
- Siempre que:
xf > x0
m=1
- Tenemos:
(xk, yk)
- El siguiente punto a pintar es:
(xk + 1, yk + 1)
- Siempre que:
xf > x0
Comentarios
Publicar un comentario