logo

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 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

  1. Ofwel degene aan de rechterkant (ondergrens voor de lijn)
  2. 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'.

Bresenham

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

Bresenham

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

Bresenham

Vervang m door Bresenhamen het introduceren van een beslissingsvariabele
Di=△x (s-t)
Di=△x (2 Bresenham(Xi+1)+2b-2yi-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
Di=2△y.xi-2△x.yi+c

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

We kunnen de beslissingsvariabele d schrijvenik+1voor de volgende slip-on
Dik+1=2△y.xik+1-2△x.yik+1+c
Dik+1-Di=2△j.(xik+1-Xi)- 2△x(jik+1-Eni)

Omdat x_(i+1)=xi+1, dat hebben we
Dik+1+di=2△j.(xi+1-xi)- 2△x(jik+1-Eni)

Speciale gevallen

Als de gekozen pixel zich op de bovenste pixel T bevindt (d.w.z. di≧0)⟹ enik+1=ji+1
Dik+1=di+2△y-2△x

Als de gekozen pixel zich op de onderste pixel T bevindt (d.w.z. di<0)⟹ yik+1=ji
Dik+1=di+2△j

Tenslotte berekenen we d1
D1=△x[2m(x1+1)+2b-2y1-1]
D1=△x[2(mx1+b-y1)+2m-1]

Sinds MX1+b-yi=0 en m= , we hebben
D1=2△y-△x

Voordeel:

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.

Nadeel:

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.

Het lijnalgoritme van Bresenham:

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
Waar x1,En1zijn de coördinaten van het startpunt
En x2,En2zijn de coördinaten van het eindpunt

Stap 4: Bereken dx = x2-X1
Bereken dy = y2-En1
Bereken ik1=2*jij
Bereken ik2=2*(dy-dx)
Bereken d=i1-dx

Stap 5: Beschouw (x, y) als uitgangspunt en xeindeals maximaal mogelijke waarde van x.
Als dx<0
Dan x = x2
j = j2
Xeinde=x1
Als dx > 0
Dan x = x1
j = j1
Xeinde=x2

Stap6: Genereer een punt op (x,y)coördinaten.

Stap7: Controleer of de hele lijn is gegenereerd.
Als x > = xeinde
Stop.

Stap 8: Bereken de coördinaten van de volgende pixel
Als d<0
Dan d = d + ik1
Als d ≧ 0
Dan d = d + ik2
Verhoging y = y + 1

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

Uitgang:


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.