Aquest algorisme s'utilitza per escanejar la conversió d'una línia. Va ser desenvolupat per Bresenham. És un mètode eficaç perquè només implica operacions de suma, restes i multiplicacions de nombres enters. Aquestes operacions es poden realitzar molt ràpidament, de manera que es poden generar línies ràpidament.
En aquest mètode, el següent píxel seleccionat és el que té la menor distància de la línia real.
El mètode funciona de la següent manera:
Suposem un píxel P1'(x1',i1'), a continuació, seleccioneu els píxels posteriors mentre treballem el nostre poder fins a la nit, una posició de píxel a la vegada en la direcció horitzontal cap a P2'(x2',i2').
Una vegada que hi hagi un píxel, escolliu en qualsevol pas
El següent píxel és
marquesina html
- O el de la seva dreta (límit inferior per a la línia)
- Un a la part superior dreta i amunt (límit superior per a la línia)
La línia s'aproxima millor per aquells píxels que cauen a la menor distància del camí entre P1', P2'.
A tria el següent entre el píxel inferior S i el píxel superior T.
Si s'escull S
Tenim xi+1=xi+1 i yi+1=ii
Si s'escull T
Tenim xi+1=xi+1 i yi+1=ii+1
Les coordenades y reals de la línia en x = xi+1és
y=mxi+1+b
La distància de S a la línia real en direcció y
s = y-yi
La distància des de T fins a la línia real en direcció y
t = (yi+1)-i
Ara considereu la diferència entre aquests 2 valors de distància
s - t
Quan (s-t)<0 ⟹ s < t< p>
El píxel més proper és S
Quan (s-t) ≧0 ⟹ s El píxel més proper és T Aquesta diferència és Substituint m per i introduint la variable de decisió On c= 2△y+△x (2b-1) Podem escriure la variable de decisió di+1per a la propera relliscada Com que x_(i+1)=xi+1, tenim Casos especials Si el píxel escollit es troba al píxel superior T (és a dir, di≧0)⟹ ii+1=ii+1 Si el píxel escollit es troba al píxel inferior T (és a dir, di<0)⟹ yi+1=yi Finalment, calculem d1 Des de mx1+b-ii=0 i m = , tenim 1. Implica només aritmètica de nombres enters, de manera que és senzill. 2. Evita la generació de punts duplicats. 3. Es pot implementar mitjançant maquinari perquè no utilitza multiplicació i divisió. 4. És més ràpid en comparació amb DDA (Digital Differential Analyzer) perquè no implica càlculs de coma flotant com l'algoritme DDA. 1. Aquest algorisme només està pensat per al dibuix de línies bàsics. La inicialització no forma part de l'algorisme de línies de Bresenham. Per tant, per dibuixar línies suaus, hauríeu de buscar un algorisme diferent. Pas 1: Inicia l'algoritme Pas 2: Declara la variable x1,x2,i1,i2,d,i1,i2,dx,dy Pas 3: Introduïu el valor de x1,i1,x2,i2 Pas 4: Calcula dx = x2-x1 Pas 5: Considereu (x, y) com a punt de partida i xfinalcom a valor màxim possible de x. Pas 6: Generar punt a les coordenades (x,y). Pas 7: Comproveu si s'ha generat una línia sencera. Pas 8: Calcula les coordenades del píxel següent Pas 9: Increment x = x + 1 Pas 10: Dibuixa un punt de les últimes coordenades (x, y). Pas 11: Aneu al pas 7 Pas 12: Final de l'algoritme Exemple: La posició inicial i final de la línia són (1, 1) i (8, 5). Troba punts intermedis. Solució: x1=1 Sortida:
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1
di=△x (s-t)
di=△x (2 (xi+1)+2b-2yi-1)
=2△xii-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.yi+c
di+1=2△y.xi+1-2△x.yi+1+c
di+1-di=2△y.(xi+1-xi)- 2△x(ii+1-ii)
di+1+di=2△y.(xi+1-xi)- 2△x(ii+1-ii)
di+1=di+2△y-2△x
di+1=di+2△i0)⟹>
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-i1)+2m-1]
d1=2△y-△xAvantatge:
Desavantatge:
Algoritme de línia de Bresenham:
On x1,i1són les coordenades del punt de partida
I x2,i2són les coordenades del punt final
Calcula dy = y2-i1
Calcula i1=2*tu
Calcula i2=2*(dy-dx)
Calcula d=i1-dx
Si dx<0
Aleshores x = x2
y = y2
xfinal=x1
Si dx > 0
Aleshores x = x1
y = y1
xfinal=x20>
Si x > = xfinal
Atura.
Si d<0
Aleshores d = d + i1
Si d ≧ 0
Aleshores d = d + i2
Increment y = i + 10>etiquetes html
i1=1
x2=8
i2=5
dx = x2-x1=8-1=7
tu=i2-i1=5-1=4
jo1=2* ∆y=2*4=8
jo2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1
x i d=d+I1o jo2 1 1 d+I2=1+(-6)=-5 2 2 d+I1=-5+8=3 3 2 d+I2=3+(-6)=-3 4 3 d+I1=-3+8=5 5 3 d+I2=5+(-6)=-1 6 4 d+I1=-1+8=7 7 4 d+I2=7+(-6)=1 8 5 Programa per implementar l'algoritme de dibuix de línies 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; }
Diferencia entre l'algoritme DDA i l'algoritme de línia de Bresenham:
Algoritme DDA Algoritme de línia de Bresenham 1. L'algoritme DDA utilitza el punt flotant, és a dir, l'aritmètica real. 1. L'algoritme de línia de Bresenham utilitza un punt fix, és a dir, l'aritmètica de nombres enters 2. Els algorismes DDA utilitza la multiplicació i la divisió en el seu funcionament 2. L'algoritme de línia de Bresenham utilitza només la resta i la suma la seva operació 3. L'algoritme DDA és lentament que l'algoritme de línia de Bresenham en el dibuix de línies perquè utilitza aritmètica real (operació de coma flotant) 3. L'algoritme de Bresenham és més ràpid que l'algoritme DDA en línia perquè només implica la suma i la resta en el seu càlcul i només utilitza aritmètica enter. 4. L'algoritme DDA no és precís i eficient com l'algoritme de línia de Bresenham. 4. L'algoritme de línia de Bresenham és més precís i eficient a l'algoritme DDA. 5. L'algoritme DDA pot dibuixar cercles i corbes, però no són exactes com l'algoritme de línia de Bresenham 5. L'algoritme de línia de Bresenham pot dibuixar cercles i corbes amb més precisió que l'algoritme DDA.