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
- O el que está a su derecha (límite inferior de la línea)
- 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'.
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
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 Sustituyendo m por e introduciendo la variable de decisión Donde c= 2△y+△x (2b-1) Podemos escribir la variable de decisión dyo+1para el próximo deslizamiento Dado que x_(i+1)=xi+1, tenemos Casos especiales Si el píxel elegido está en el píxel superior T (es decir, di≧0)⟹ yyo+1=yi+1 Si el píxel elegido está en el píxel inferior T (es decir, di<0)⟹ yi+1=yi Finalmente calculamos d1 desde mx1+b-yi=0 y m = , tenemos 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. 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. Paso 1: Iniciar algoritmo Paso 2: Declarar variable x1,X2,y1,y2,d,yo1,i2,dx,dy Paso 3: Introduzca el valor de x1,y1,X2,y2 Etapa 4: Calcular dx = x2-X1 Paso 5: Considere (x, y) como punto de partida y xfincomo valor máximo posible de x. Paso 6: Generar punto en coordenadas (x,y). Paso 7: Compruebe si se genera la línea completa. Paso 8: Calcular las coordenadas del siguiente píxel. 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 Producción:
s-t = (y-yi)-[(yi+1)-y]
= 2 años - 2 años -1
di=△x (st)
di=△x (2 (Xi+1)+2b-2ai-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.yi+c
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
dyo+1+di=2△y.(xi+1-xi)- 2△x(yyo+1-yi)
dyo+1=di+2△y-2△x
dyo+1=di+2△y0)⟹>
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-y1)+2m-1]
d1=2△y-△xVentaja:
Desventaja:
Algoritmo de línea de Bresenham:
novios y dfs
donde x1,y1son las coordenadas del punto de partida
yx2,y2son coordenadas del punto final
Calcular dy = y2-y1
calcular yo1=2*tú
calcular yo2=2*(dy-dx)
Calcular d=i1-dx
si dx<0
Entonces x = x2
y = y2
Xfin=x1
Si dx > 0
Entonces x = x1
y = y1
Xfin=x20>
Si x > = xfin
Detener.
si d<0
Entonces d = d + i1
Si d ≧ 0
Entonces d = d + i2
Increment y = y + 10>
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(&gdriver, &gmode, 'c:\turboc3\bgi'); printf('Enter co-ordinates of first point: '); scanf('%d%d', &x0, &y0); printf('Enter co-ordinates of second point: '); scanf('%d%d', &x1, &y1); drawline(x0, y0, x1, y1); return 0; }
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.