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)
De donde:
y = (∆y/∆x)x + b ...(3)

    0<m<1

    Tenemos:
    (xk, yk)
    Los posibles puntos a pintar serian:
    (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)
    Si d1 < d2
    • yk está más cerca de la trayectoria de la recta
    • pk  es negativo
    Caso contrario
    • yk+1 está más cerca de la trayectoria de la recta
    • pk  es positivo
    En el paso k+1, el parámetro de decisión se evalúa con base en la ecuación anterior:
    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)
    Los posibles puntos a pintar serian:
    (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)
    Si d1 < d2
    • yk - 1 está más cerca de la trayectoria de la recta
    • pk  es negativo
    Caso contrario
    • yk está más cerca de la trayectoria de la recta
    • pk  es positivo
    En el paso k+1, el parámetro de decisión se evalúa con base en la ecuación anterior:
    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

    Tenemos:
    (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∆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∆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)
    Si d1 < d2
    • xk está más cerca de la trayectoria de la recta
    • pk  es negativo
    Caso contrario
    • xk+1 está más cerca de la trayectoria de la recta
    • pk  es positivo
    En el paso k+1, el parámetro de decisión se evalúa con base en la ecuación anterior:
    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:
    • 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
    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

    Tenemos:
    (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 = 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 =2∆yxk - 2∆x(yk + 1 - b) + ∆y
    pk =2∆yxk - 2∆xyk - 2∆x + 2∆xb + ∆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
    Caso contrario
    • xk+1 está más cerca de la trayectoria de la recta
    • pk  es positivo
    En el paso k+1, el parámetro de decisión se evalúa con base en la ecuación anterior:
    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:
    • 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

    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

    m=-1

    • Tenemos: 
    (xk, yk) 
    • El siguiente punto a pintar es: 
    (xk + 1, yk - 1)
    • Siempre que:
    xf > x0

    m= ∞

    • Tenemos: 
    (xk, yk) 
    • El siguiente punto a pintar es: 
    (xk , yk + 1)
    • Siempre que:
    yf > y0


    ECUACIONES

    CREANDO CÓDIGO

    RELACIONADOS

    Comentarios

    Popular Posts

    Sistemas Distribuidos - Tolerancia a fallos

    Crear Autómata Finito Determinista desde una Expresión Regular

    Instalar OpenGL en Linux