Questo algoritmo viene utilizzato per convertire la scansione di una linea. È stato sviluppato da Bresenham. È un metodo efficiente perché prevede solo operazioni di addizione, sottrazione e moltiplicazione di numeri interi. Queste operazioni possono essere eseguite molto rapidamente in modo che le linee possano essere generate rapidamente.
In questo metodo, il pixel successivo selezionato è quello che ha la distanza minore dalla linea reale.
Il metodo funziona come segue:
Assumi un pixel P1'(X1',E1'), quindi seleziona i pixel successivi mentre lavoriamo fino alla notte, una posizione di pixel alla volta nella direzione orizzontale verso P2'(X2',E2').
Una volta inserito un pixel, scegli in qualsiasi passaggio
Il pixel successivo è
- O quello alla sua destra (limite inferiore per la linea)
- Uno in alto a destra e in alto (limite superiore per la linea)
La linea viene approssimata meglio da quei pixel che cadono alla minima distanza dal percorso tra P1',P2'.
Per sceglie quello successivo tra il pixel inferiore S e il pixel superiore T.
Se si sceglie S
Abbiamo xio+1=xio+1 e yio+1=yio
Se si sceglie T
Abbiamo xio+1=xio+1 e yio+1=yio+1
Le coordinate y effettive della linea in x = xio+1È
y=mxio+1+b
La distanza da S alla linea effettiva nella direzione y
s = aaio
metodi stringa in Java
La distanza da T alla linea effettiva nella direzione y
t = (yio+1)-y
Consideriamo ora la differenza tra questi 2 valori di distanza
s - t
metodi di arraylist
Quando (s-t)<0 ⟹ s < t< p>
Il pixel più vicino è S
Quando (s-t) ≧0 ⟹ s Il pixel più vicino è T Questa differenza è Sostituendo m con e introducendo la variabile decisionale Dove c= 2△y+△x (2b-1) Possiamo scrivere la variabile decisionale dio+1per il prossimo slip on Poiché x_(i+1)=xio+1, abbiamo Casi speciali Se il pixel scelto è in alto, il pixel T (cioè dio≧0)⟹ eio+1=yio+1 Se il pixel scelto si trova nel pixel inferiore T (ad esempio, dio<0)⟹ yio+1=yio Infine calcoliamo d1 Dal mx1+a-aio=0 e m = , abbiamo 1. Implica solo l'aritmetica dei numeri interi, quindi è semplice. 2. Evita la generazione di punti duplicati. 3. Può essere implementato utilizzando l'hardware perché non utilizza moltiplicazioni e divisioni. 4. È più veloce rispetto a DDA (Digital Differential Analyser) perché non prevede calcoli in virgola mobile come l'algoritmo DDA. 1. Questo algoritmo è pensato solo per il disegno di linee di base. L'inizializzazione non fa parte dell'algoritmo delle linee di Bresenham. Quindi, per disegnare linee morbide, dovresti esaminare un algoritmo diverso. Passo 1: Avvia algoritmo Passo 2: Dichiarare la variabile x1,X2,E1,E2,d,i1,io2,dx,dy Passaggio 3: Immettere il valore di x1,E1,X2,E2 Passaggio 4: Calcola dx = x2-X1 Passaggio 5: Considera (x, y) come punto di partenza e xFINEcome massimo valore possibile di x. Passaggio 6: Genera punto alle coordinate (x,y). Passaggio 7: Controlla se viene generata l'intera riga. Passaggio 8: Calcola le coordinate del pixel successivo Passaggio 9: Incremento x = x + 1 Passaggio 10: Disegna un punto delle ultime coordinate (x, y). Passaggio 11: Vai al passaggio 7 Passaggio 12: Fine dell'algoritmo Esempio: Le posizioni iniziale e finale della linea sono (1, 1) e (8, 5). Trova punti intermedi. Soluzione: X1=1 Produzione:
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1
Dio=△x (s-t)
Dio=△x(2 (Xio+1)+2b-2yio-1)
=2△xyio-2△y-1△x.2b-2yio△x-△x
Dio=2△y.xio-2△x.aio+c
Dio+1=2△y.xio+1-2△x.aio+1+c
Dio+1-Dio=2△y.(xio+1-Xio)- 2△x(yio+1-Eio)
Dio+1+dio=2△y.(xio+1-xio)- 2△x(yio+1-Eio)
Dio+1=dio+2△y-2△x
Dio+1=dio+2△a0)⟹>
D1=△x[2m(x1+1)+2b-2y1-1]
D1=△x[2(mx1+a-a1)+2m-1]
D1=2△y-△xVantaggio:
Svantaggio:
Java comparabile
Algoritmo della linea di Bresenham:
Dove x1,E1sono le coordinate del punto di partenza
E x2,E2sono le coordinate del punto finale
Calcola dy = y2-E1
Calcola i1=2*tu
Calcola i2=2*(dy-dx)
Calcola d=i1-dx
Se dx<0
Allora x = x2
y = y2
XFINE=x1
Se dx > 0
Allora x = x1
y = y1
XFINE=x20>10 di 100,00
Se x > = xFINE
Fermare.
Se d<0
Allora d = d + i1
Se d ≧ 0
Allora d = d + i2
Incremento y = y + 10>
E1=1
X2=8
E2=5
dx=x2-X1=8-1=7
tu=sì2-E1=5-1=4
IO1=2* ∆y=2*4=8
IO2=2*(∆y-∆x)=2*(4-7)=-6
d = io1-∆x=8-7=1
X E d=d+I1o io2 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 Programma per implementare l'algoritmo di disegno al tratto di 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; }
Distinguere tra l'algoritmo DDA e l'algoritmo della linea di Bresenham:
Algoritmo DDA Algoritmo della linea di Bresenham 1. L'algoritmo DDA utilizza la virgola mobile, ovvero l'aritmetica reale. 1. L'algoritmo della linea di Bresenham utilizza il punto fisso, ovvero l'aritmetica dei numeri interi 2. Gli algoritmi DDA utilizzano la moltiplicazione e la divisione nelle sue operazioni 2.L'algoritmo della linea di Bresenham utilizza solo la sottrazione e l'addizione 3. L'algoritmo DDA è lento rispetto all'algoritmo Line di Bresenham nel disegno al tratto perché utilizza l'aritmetica reale (operazione in virgola mobile) 3. L'algoritmo di Bresenham è più veloce dell'algoritmo DDA in linea perché prevede solo addizioni e sottrazioni nel calcolo e utilizza solo l'aritmetica dei numeri interi. 4. L'algoritmo DDA non è accurato ed efficiente come l'algoritmo della linea di Bresenham. 4. L'algoritmo della linea di Bresenham è più accurato ed efficiente nell'algoritmo DDA. 5.L'algoritmo DDA può disegnare cerchi e curve ma non è accurato come l'algoritmo della linea di Bresenham 5. L'algoritmo della linea di Bresenham può disegnare cerchi e curve con maggiore precisione dell'algoritmo DDA.