logo

Algoritmo de línea de Bresenham

Este algoritmo se utiliza para escanear y convertir una línea. Fue desarrollado por Bresenham. Es un método eficiente porque implica únicamente operaciones de suma, resta y multiplicación de números enteros. Estas operaciones se pueden realizar muy rápidamente, por lo que las líneas se pueden generar rápidamente.

En este método, el siguiente píxel seleccionado es el que tiene la menor distancia desde la línea verdadera.

El método funciona de la siguiente manera:

Supongamos un píxel P1'(X1',y1'), luego seleccione los píxeles siguientes a medida que avanzamos hacia la noche, una posición de píxel a la vez en la dirección horizontal hacia P2'(X2',y2').

Una vez que haya un píxel, elija en cualquier paso.

El siguiente píxel es

  1. O el que está a su derecha (límite inferior de la línea)
  2. Uno arriba a la derecha y arriba (límite superior de la línea)

La línea se aproxima mejor mediante aquellos píxeles que se encuentran a la menor distancia del camino entre P1',PAG2'.

Bresenham

Para elegir el siguiente entre el píxel inferior S y el píxel superior T.
Si se elige S
tenemos xyo+1=xi+1 y yyo+1=yi
Si se elige T
tenemos xyo+1=xi+1 y yyo+1=yi+1

Las coordenadas y reales de la línea en x = xyo+1es
y=mxyo+1+b

Bresenham

La distancia desde S hasta la línea real en la dirección y.
s = y-yi

La distancia de T a la línea real en la dirección y.
t = (yi+1)-y

Ahora considere la diferencia entre estos 2 valores de distancia.
calle

cuando (st)<0 ⟹ s < t< p>

El píxel más cercano es S

Cuando (s-t) ≧0 ⟹ s

El píxel más cercano es T

Esta diferencia es
s-t = (y-yi)-[(yi+1)-y]
= 2 años - 2 años -1

Bresenham

Sustituyendo m por Bresenhame introduciendo la variable de decisión
di=△x (st)
di=△x (2 Bresenham(Xi+1)+2b-2ai-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.yi+c

Donde c= 2△y+△x (2b-1)

Podemos escribir la variable de decisión dyo+1para el próximo deslizamiento
dyo+1=2△y.xyo+1-2△x.yyo+1+c
dyo+1-di=2△y.(xyo+1-Xi)- 2△x(yyo+1-yi)

monitor de tubo de rayos catódicos

Dado que x_(i+1)=xi+1, tenemos
dyo+1+di=2△y.(xi+1-xi)- 2△x(yyo+1-yi)

Casos especiales

Si el píxel elegido está en el píxel superior T (es decir, di≧0)⟹ yyo+1=yi+1
dyo+1=di+2△y-2△x

Si el píxel elegido está en el píxel inferior T (es decir, di<0)⟹ yi+1=yi
dyo+1=di+2△y

Finalmente calculamos d1
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-y1)+2m-1]

desde mx1+b-yi=0 y m = , tenemos
d1=2△y-△x

Ventaja:

1. Sólo implica aritmética de números enteros, por lo que es simple.

2. Evita la generación de puntos duplicados.

3. Se puede implementar mediante hardware porque no utiliza multiplicación ni división.

4. Es más rápido en comparación con DDA (Analizador Diferencial Digital) porque no implica cálculos de punto flotante como el algoritmo DDA.

Desventaja:

1. Este algoritmo está destinado únicamente al dibujo de líneas básicas. La inicialización no forma parte del algoritmo de líneas de Bresenham. Entonces, para dibujar líneas suaves, deberías buscar un algoritmo diferente.

Algoritmo de línea de Bresenham:

Paso 1: Iniciar algoritmo

novios y dfs

Paso 2: Declarar variable x1,X2,y1,y2,d,yo1,i2,dx,dy

Paso 3: Introduzca el valor de x1,y1,X2,y2
donde x1,y1son las coordenadas del punto de partida
yx2,y2son coordenadas del punto final

Etapa 4: Calcular dx = x2-X1
Calcular dy = y2-y1
calcular yo1=2*tú
calcular yo2=2*(dy-dx)
Calcular d=i1-dx

Paso 5: Considere (x, y) como punto de partida y xfincomo valor máximo posible de x.
si dx<0
Entonces x = x2
y = y2
Xfin=x1
Si dx > 0
Entonces x = x1
y = y1
Xfin=x2

Paso 6: Generar punto en coordenadas (x,y).

Paso 7: Compruebe si se genera la línea completa.
Si x > = xfin
Detener.

Paso 8: Calcular las coordenadas del siguiente píxel.
si d<0
Entonces d = d + i1
Si d ≧ 0
Entonces d = d + i2
Increment y = y + 1

Paso 9: Incremento x = x + 1

Paso 10: Dibuja un punto de las últimas coordenadas (x, y)

Paso 11: Ir al paso 7

Paso 12: Fin del algoritmo

Ejemplo: Las posiciones inicial y final de la línea son (1, 1) y (8, 5). Encuentra puntos intermedios.

Solución: X1=1
y1=1
X2=8
y2=5
dx=x2-X1=8-1=7
tu=y2-y1=5-1=4
I1=2* ∆y=2*4=8
I2=2*(∆y-∆x)=2*(4-7)=-6
re = yo1-∆x=8-7=1

X y d=d+yo1o yo2
1 1 d+yo2=1+(-6)=-5
2 2 d+yo1=-5+8=3
3 2 d+yo2=3+(-6)=-3
4 3 d+yo1=-3+8=5
5 3 d+yo2=5+(-6)=-1
6 4 d+yo1=-1+8=7
7 4 d+yo2=7+(-6)=1
8 5

Programa para implementar el Algoritmo de Dibujo Lineal de Bresenham:

 #include #include void drawline(int x0, int y0, int x1, int y1) { int dx, dy, p, x, y; dx=x1-x0; dy=y1-y0; x=x0; y=y0; p=2*dy-dx; while(x=0) { putpixel(x,y,7); y=y+1; p=p+2*dy-2*dx; } else { putpixel(x,y,7); p=p+2*dy;} x=x+1; } } int main() { int gdriver=DETECT, gmode, error, x0, y0, x1, y1; initgraph(&amp;gdriver, &amp;gmode, &apos;c:\turboc3\bgi&apos;); printf(&apos;Enter co-ordinates of first point: &apos;); scanf(&apos;%d%d&apos;, &amp;x0, &amp;y0); printf(&apos;Enter co-ordinates of second point: &apos;); scanf(&apos;%d%d&apos;, &amp;x1, &amp;y1); drawline(x0, y0, x1, y1); return 0; } 

Producción:


Diferenciar entre el algoritmo DDA y el algoritmo lineal de Bresenham:

Algoritmo DDA Algoritmo de línea de Bresenham
1. El algoritmo DDA utiliza punto flotante, es decir, aritmética real. 1. El algoritmo lineal de Bresenham utiliza un punto fijo, es decir, aritmética de enteros
2. Los algoritmos DDA utilizan la multiplicación y la división en su operación. 2.El algoritmo lineal de Bresenham utiliza únicamente la resta y la suma en su operación
3. El algoritmo DDA es más lento que el algoritmo lineal de Bresenham en el dibujo lineal porque utiliza aritmética real (operación de punto flotante) 3. El algoritmo de Bresenham es más rápido que el algoritmo DDA en línea porque solo implica sumas y restas en su cálculo y utiliza solo aritmética de enteros.
4. El algoritmo DDA no es preciso ni eficiente como el algoritmo lineal de Bresenham. 4. El algoritmo de línea de Bresenham es más preciso y eficiente que el algoritmo DDA.
5.El algoritmo DDA puede dibujar círculos y curvas, pero no es tan preciso como el algoritmo lineal de Bresenham. 5. El algoritmo de líneas de Bresenham puede dibujar círculos y curvas con mayor precisión que el algoritmo DDA.