logo

Algoritmo della linea di Bresenham

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 è

  1. O quello alla sua destra (limite inferiore per la linea)
  2. 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'.

Bresenham

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

Bresenham

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 è
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Bresenham

Sostituendo m con Bresenhame introducendo la variabile decisionale
Dio=△x (s-t)
Dio=△x(2 Bresenham(Xio+1)+2b-2yio-1)
=2△xyio-2△y-1△x.2b-2yio△x-△x
Dio=2△y.xio-2△x.aio+c

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

Possiamo scrivere la variabile decisionale dio+1per il prossimo slip on
Dio+1=2△y.xio+1-2△x.aio+1+c
Dio+1-Dio=2△y.(xio+1-Xio)- 2△x(yio+1-Eio)

Poiché x_(i+1)=xio+1, abbiamo
Dio+1+dio=2△y.(xio+1-xio)- 2△x(yio+1-Eio)

Casi speciali

Se il pixel scelto è in alto, il pixel T (cioè dio≧0)⟹ eio+1=yio+1
Dio+1=dio+2△y-2△x

Se il pixel scelto si trova nel pixel inferiore T (ad esempio, dio<0)⟹ yio+1=yio
Dio+1=dio+2△a

Infine calcoliamo d1
D1=△x[2m(x1+1)+2b-2y1-1]
D1=△x[2(mx1+a-a1)+2m-1]

Dal mx1+a-aio=0 e m = , abbiamo
D1=2△y-△x

Vantaggio:

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.

Svantaggio:

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.

Java comparabile

Algoritmo della linea di Bresenham:

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
Dove x1,E1sono le coordinate del punto di partenza
E x2,E2sono le coordinate del punto finale

Passaggio 4: Calcola dx = x2-X1
Calcola dy = y2-E1
Calcola i1=2*tu
Calcola i2=2*(dy-dx)
Calcola d=i1-dx

Passaggio 5: Considera (x, y) come punto di partenza e xFINEcome massimo valore possibile di x.
Se dx<0
Allora x = x2
y = y2
XFINE=x1
Se dx > 0
Allora x = x1
y = y1
XFINE=x2

Passaggio 6: Genera punto alle coordinate (x,y).

10 di 100,00

Passaggio 7: Controlla se viene generata l'intera riga.
Se x > = xFINE
Fermare.

Passaggio 8: Calcola le coordinate del pixel successivo
Se d<0
Allora d = d + i1
Se d ≧ 0
Allora d = d + i2
Incremento y = y + 1

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
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(&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; } 

Produzione:


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.