Lijnalgoritme van Bresenham
Dit algoritme wordt gebruikt voor het scannen van een lijn. Het is ontwikkeld door Bresenham. Het is een efficiënte methode omdat het alleen gaat om optellingen, aftrekkingen en vermenigvuldigingen van gehele getallen. Deze bewerkingen kunnen zeer snel worden uitgevoerd, zodat lijnen snel kunnen worden gegenereerd.
Bij deze methode wordt de volgende pixel geselecteerd die de minste afstand tot de ware lijn heeft.
De methode werkt als volgt:
Stel een pixel P 1 '(X 1 ',En 1 '), selecteer vervolgens de volgende pixels terwijl we tot diep in de nacht doorwerken, pixelpositie voor pixel in de horizontale richting richting P 2 '(X 2 ',En 2 ').
Zodra u bij elke stap een pixel kiest
De volgende pixel is
- Ofwel degene aan de rechterkant (ondergrens voor de lijn)
- Eén bovenaan is rechts en omhoog (bovengrens voor de lijn)
De lijn wordt het beste benaderd door de pixels die zich op de kleinste afstand van het pad tussen P bevinden 1 ',P 2 '.
To kiest de volgende tussen de onderste pixel S en de bovenste pixel T.
Als S wordt gekozen
Wij hebben x ik+1 =x i +1 en j ik+1 =j i
Als T wordt gekozen
Wij hebben x ik+1 =x i +1 en j ik+1 =j i +1
De werkelijke y-coördinaten van de lijn op x = x ik+1 is
y=mx ik+1 +b
De afstand van S tot de werkelijke lijn in de y-richting
s = j-j i
De afstand van T tot de werkelijke lijn in de y-richting
t = (j i +1)-j
Beschouw nu het verschil tussen deze 2 afstandswaarden
s - t
Wanneer (s-t) <0 ⟹ s < t < p>
De dichtstbijzijnde pixel is S
Wanneer (s-t) ≧0 ⟹ s De dichtstbijzijnde pixel is T Dit verschil is Vervang m door Waar c= 2△y+△x (2b-1) We kunnen de beslissingsvariabele d schrijven ik+1 voor de volgende slip-on Omdat x_(i+1)=x i +1, dat hebben we Speciale gevallen Als de gekozen pixel zich op de bovenste pixel T bevindt (d.w.z. d i ≧0)⟹ en ik+1 =j i +1 Als de gekozen pixel zich op de onderste pixel T bevindt (d.w.z. d i <0)⟹ y ik+1=j i Tenslotte berekenen we d 1 Sinds MX 1 +b-y i =0 en m= 1. Het gaat alleen om rekenen met gehele getallen, dus het is eenvoudig. 2. Het vermijdt het genereren van dubbele punten. 3. Het kan worden geïmplementeerd met behulp van hardware, omdat er geen gebruik wordt gemaakt van vermenigvuldigen en delen. 4. Het is sneller in vergelijking met DDA (Digital Differential Analyzer) omdat er geen drijvende-kommaberekeningen nodig zijn, zoals het DDA-algoritme. 1. Dit algoritme is alleen bedoeld voor het tekenen van basislijnen. Initialiseren maakt geen deel uit van het lijnalgoritme van Bresenham. Om vloeiende lijnen te tekenen, zou je dus naar een ander algoritme moeten kijken. Stap 1: Begin algoritme Stap 2: Declareer variabele x 1 ,X 2 ,En 1 ,En 2 ,d,ik 1 ,i 2 ,dx,dy Stap 3: Voer de waarde van x in 1 ,En 1 ,X 2 ,En 2 Stap 4: Bereken dx = x 2 -X 1 Stap 5: Beschouw (x, y) als uitgangspunt en x einde als maximaal mogelijke waarde van x. Stap6: Genereer een punt op (x,y)coördinaten. Stap7: Controleer of de hele lijn is gegenereerd. Stap 8: Bereken de coördinaten van de volgende pixel Stap9: Verhogen x = x + 1 Stap 10: Teken een punt met de laatste (x, y)-coördinaten Stap 11: Ga naar stap 7 Stap 12: Einde van algoritme Voorbeeld: Begin- en eindpositie van de lijn zijn (1, 1) en (8, 5). Zoek tussenpunten. Oplossing: X 1 =1 Uitgang:
s-t = (y-yi)-[(yi+1)-y]
= 2j - 2yi -1
en het introduceren van een beslissingsvariabele
D i =△x (s-t)
D i =△x (2
(X i +1)+2b-2y i -1)
=2△xy i -2△y-1△x.2b-2y i △x-△x
D i =2△y.x i -2△x.y i +c
D ik+1 =2△y.x ik+1 -2△x.y ik+1 +c
D ik+1 -D i =2△j.(x ik+1 -X i )- 2△x(j ik+1 -En i )
D ik+1 +d i =2△j.(x i +1-x i )- 2△x(j ik+1 -En i )
D ik+1 =d i +2△y-2△x
D ik+1 =d i +2△j 0)⟹>
D 1 =△x[2m(x 1 +1)+2b-2y 1 -1]
D 1 =△x[2(mx 1 +b-y 1 )+2m-1]
, we hebben
D 1 =2△y-△x Voordeel:
Nadeel:
Het lijnalgoritme van Bresenham:
Waar x 1 ,En 1 zijn de coördinaten van het startpunt
En x 2 ,En 2 zijn de coördinaten van het eindpunt
Bereken dy = y 2 -En 1
Bereken ik 1 =2*jij
Bereken ik 2 =2*(dy-dx)
Bereken d=i 1 -dx
Als dx <0
Dan x = x 2
j = j 2
X einde =x 1
Als dx > 0
Dan x = x 1
j = j 1
X einde =x 2 0>
Als x > = x einde
Stop.
Als d <0
Dan d = d + ik 1
Als d ≧ 0
Dan d = d + ik 2
Verhoging y = y + 1 0>
En 1 =1
X 2 =8
En 2 =5
dx = x 2 -X 1 =8-1=7
jij=j 2 -En 1 =5-1=4
I 1 =2* ∆y=2*4=8
I 2 =2*(∆y-∆x)=2*(4-7)=-6
d = ik 1 -∆x=8-7=1
X En d=d+I 1 of ik 2 1 1 d+ik 2 =1+(-6)=-5 2 2 d+ik 1 =-5+8=3 3 2 d+ik 2 =3+(-6)=-3 4 3 d+ik 1 =-3+8=5 5 3 d+ik 2 =5+(-6)=-1 6 4 d+ik 1 =-1+8=7 7 4 d+ik 2 =7+(-6)=1 8 5
Programma om het lijntekeningalgoritme van Bresenham te implementeren:
#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; }
Maak onderscheid tussen het DDA-algoritme en het lijnalgoritme van Bresenham:
DDA-algoritme Lijnalgoritme van Bresenham 1. DDA-algoritme gebruikt drijvende komma, d.w.z. echte rekenkunde. 1. Het lijnalgoritme van Bresenham gebruikt een vast punt, d.w.z. rekenkunde met gehele getallen 2. DDA-algoritmen maken gebruik van vermenigvuldigen en delen 2. Het lijnalgoritme van Bresenham gebruikt alleen aftrekken en optellen 3. Het DDA-algoritme is langzamer dan het lijnalgoritme van Bresenham bij het tekenen van lijnen, omdat het echte rekenkunde gebruikt (Floating Point-bewerking) 3. Het algoritme van Bresenham is sneller dan het DDA-algoritme in lijn, omdat het bij de berekening alleen optellen en aftrekken omvat en alleen rekenen met gehele getallen gebruikt. 4. Het DDA-algoritme is niet nauwkeurig en efficiënt als het lijnalgoritme van Bresenham. 4. Het lijnalgoritme van Bresenham is nauwkeuriger en efficiënter bij het DDA-algoritme. 5.DDA-algoritme kan cirkels en curven tekenen, maar is niet nauwkeurig als het lijnalgoritme van Bresenham 5. Het lijnalgoritme van Bresenham kan cirkels en curven nauwkeuriger tekenen dan het DDA-algoritme.