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 P1'(X1',En1'), selecteer vervolgens de volgende pixels terwijl we tot diep in de nacht doorwerken, pixelpositie voor pixel in de horizontale richting richting P2'(X2',En2').
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 bevinden1',P2'.
To kiest de volgende tussen de onderste pixel S en de bovenste pixel T.
Als S wordt gekozen
Wij hebben xik+1=xi+1 en jik+1=ji
Als T wordt gekozen
Wij hebben xik+1=xi+1 en jik+1=ji+1
De werkelijke y-coördinaten van de lijn op x = xik+1is
y=mxik+1+b
De afstand van S tot de werkelijke lijn in de y-richting
s = j-ji
De afstand van T tot de werkelijke lijn in de y-richting
t = (ji+1)-j
Beschouw nu het verschil tussen deze 2 afstandswaarden
s - t
tekenreeks en subtekenreeks
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 en het introduceren van een beslissingsvariabele Waar c= 2△y+△x (2b-1) We kunnen de beslissingsvariabele d schrijvenik+1voor de volgende slip-on Omdat x_(i+1)=xi+1, dat hebben we Speciale gevallen Als de gekozen pixel zich op de bovenste pixel T bevindt (d.w.z. di≧0)⟹ enik+1=ji+1 Als de gekozen pixel zich op de onderste pixel T bevindt (d.w.z. di<0)⟹ yik+1=ji Tenslotte berekenen we d1 Sinds MX1+b-yi=0 en m= , we hebben 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 x1,X2,En1,En2,d,ik1,i2,dx,dy Stap 3: Voer de waarde van x in1,En1,X2,En2 Stap 4: Bereken dx = x2-X1 Stap 5: Beschouw (x, y) als uitgangspunt en xeindeals 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: X1=1 Uitgang:
s-t = (y-yi)-[(yi+1)-y]
= 2j - 2yi -1
Di=△x (s-t)
Di=△x (2 (Xi+1)+2b-2yi-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
Di=2△y.xi-2△x.yi+c
Dik+1=2△y.xik+1-2△x.yik+1+c
Dik+1-Di=2△j.(xik+1-Xi)- 2△x(jik+1-Eni)
Dik+1+di=2△j.(xi+1-xi)- 2△x(jik+1-Eni)
Dik+1=di+2△y-2△x
Dik+1=di+2△j0)⟹>
D1=△x[2m(x1+1)+2b-2y1-1]
D1=△x[2(mx1+b-y1)+2m-1]
D1=2△y-△xVoordeel:
Nadeel:
Het lijnalgoritme van Bresenham:
Waar x1,En1zijn de coördinaten van het startpunt
En x2,En2zijn de coördinaten van het eindpunt
Bereken dy = y2-En1
Bereken ik1=2*jij
Bereken ik2=2*(dy-dx)
Bereken d=i1-dx
Als dx<0
Dan x = x2
j = j2
Xeinde=x1
Als dx > 0
Dan x = x1
j = j1
Xeinde=x20>
Als x > = xeinde
Stop.
Als d<0
Dan d = d + ik1
Als d ≧ 0
Dan d = d + ik2
Verhoging y = y + 10>
En1=1
X2=8
En2=5
dx = x2-X1=8-1=7
jij=j2-En1=5-1=4
I1=2* ∆y=2*4=8
I2=2*(∆y-∆x)=2*(4-7)=-6
d = ik1-∆x=8-7=1
X En d=d+I1of ik2 1 1 d+ik2=1+(-6)=-5 2 2 d+ik1=-5+8=3 3 2 d+ik2=3+(-6)=-3 4 3 d+ik1=-3+8=5 5 3 d+ik2=5+(-6)=-1 6 4 d+ik1=-1+8=7 7 4 d+ik2=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.