logo

Bresenhemas līnijas algoritms

Šis algoritms tiek izmantots līnijas skenēšanai. To izstrādāja Bresenham. Tā ir efektīva metode, jo tā ietver tikai veselu skaitļu saskaitīšanu, atņemšanu un reizināšanas darbības. Šīs darbības var veikt ļoti ātri, tāpēc līnijas var ātri ģenerēt.

turbo c++ lejupielāde

Izmantojot šo metodi, nākamais atlasītais pikselis ir tas, kuram ir vismazākais attālums no patiesās līnijas.

Metode darbojas šādi:

Pieņemsim pikseli P1'(x1',un1'), pēc tam atlasiet nākamos pikseļus, strādājot no maija līdz naktij, pa vienam pikseļa stāvoklim horizontālā virzienā virzienā uz P2'(x2',un2').

Kad pikselis ir ievadīts, izvēlieties jebkurā solī

Nākamais pikselis ir

  1. Vai nu pa labi (līnijas apakšējā robeža)
  2. Viena augšdaļa ir pa labi un uz augšu (līnijas augšējā robeža)

Līniju vislabāk tuvināt pēc tiem pikseļiem, kas atrodas vismazākajā attālumā no ceļa starp P1', P2'.

Brezenhema

To izvēlas nākamo starp apakšējo pikseļu S un augšējo pikseļu T.
Ja izvēlēts S
Mums ir xi+1=xi+1 un yi+1=yi
Ja izvēlēts T
Mums ir xi+1=xi+1 un yi+1=yi+1

Taisnes faktiskās y koordinātas pie x = xi+1ir
y=mxi+1+b

Brezenhema

Attālums no S līdz faktiskajai līnijai y virzienā
s = y-yi

Attālums no T līdz faktiskajai līnijai y virzienā
t = (yi+1)-y

Tagad apsveriet atšķirību starp šīm divām attāluma vērtībām
s - t

Kad (s-t)<0 ⟹ s < t< p>

Tuvākais pikselis ir S

Kad (s-t) ≧0 ⟹ s

Tuvākais pikselis ir T

Šī atšķirība ir
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Brezenhema

Aizstājot m ar Brezenhemaun ieviešot lēmumu mainīgo
di=△x (s-t)
di=△x (2 Brezenhema(xi+1)+2b-2gi-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.yi+c

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

Varam uzrakstīt lēmuma mainīgo di+1uz nākamo slīdēšanu
di+1=2△y.xi+1-2△x.yi+1+c
di+1-di=2△y.(xi+1-xi)- 2△x(yi+1-uni)

Tā kā x_(i+1)=xi+1, mums ir
di+1+di=2△y.(xi+1-xi)- 2△x(yi+1-uni)

Īpaši gadījumi

Ja izvēlētais pikselis atrodas augšējā pikselī T (t.i., di≧0)⟹ uni+1=yi+1
di+1=di+2△y-2△x

Ja izvēlētais pikselis atrodas apakšējā pikselī T (t.i., di<0)⟹ yi+1=yi
di+1=di+2△ g

Visbeidzot, mēs aprēķinām d1
d1=△x[2m(x1+1)+2b-2g1-1]
d1=△x[2(mx1+b-y1)+2m-1]

Kopš mx1+b-yi=0 un m = , mums ir
d1=2△y-△x

Priekšrocība:

1. Tas ietver tikai veselu skaitļu aritmētiku, tāpēc tas ir vienkāršs.

2. Tas ļauj izvairīties no punktu dublikātu ģenerēšanas.

3. To var ieviest, izmantojot aparatūru, jo tajā netiek izmantota reizināšana un dalīšana.

4. Tas ir ātrāks salīdzinājumā ar DDA (digitālo diferenciālo analizatoru), jo tas neietver peldošā komata aprēķinus, piemēram, DDA algoritmu.

Trūkums:

1. Šis algoritms ir paredzēts tikai pamata līniju zīmēšanai Inicializēšana nav daļa no Bresenhemas līniju algoritma. Tātad, lai zīmētu gludas līnijas, jums vajadzētu izpētīt citu algoritmu.

Bresenhemas līnijas algoritms:

1. darbība: Sākt algoritmu

2. darbība: Deklarē mainīgo x1,x2,un1,un2,d,i1,t.i2,dx,dy

3. darbība: Ievadiet x vērtību1,un1,x2,un2
Kur x1,un1ir sākuma punkta koordinātas
Un x2,un2ir beigu punkta koordinātas

4. darbība: Aprēķināt dx = x2-x1
Aprēķināt dy = y2-un1
Aprēķināt i1=2*tu
Aprēķināt i2=2*(dy-dx)
Aprēķināt d=i1-dx

5. darbība: Apsveriet (x, y) par sākuma punktu un xbeigaskā maksimālo iespējamo x vērtību.
Ja dx<0
Tad x = x2
y = y2
xbeigas=x1
Ja dx > 0
Tad x = x1
y = y1
xbeigas=x2

6. darbība: Ģenerēt punktu pie (x,y) koordinātām.

7. darbība: Pārbaudiet, vai ir izveidota visa rinda.
Ja x > = xbeigas
Stop.

lateksa matrica

8. darbība: Aprēķināt nākamā pikseļa koordinātas
Ja d<0
Tad d = d + i1
Ja d ≧ 0
Tad d = d + i2
Palieliniet y = y + 1

9. darbība: Palieliniet x = x + 1

10. darbība: Uzzīmējiet pēdējo (x, y) koordinātu punktu

11. darbība: Pārejiet uz 7. darbību

12. darbība: Algoritma beigas

Piemērs: Līnijas sākuma un beigu pozīcija ir (1, 1) un (8, 5). Atrodiet starppunktus.

Risinājums: x1=1
un1=1
x2=8
un2=5
dx = x2-x1=8-1=7
tu=y2-un1=5-1=4
es1=2* ∆y=2*4=8
es2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1

x un d=d+I1vai es2
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 Bresenhemas līniju zīmēšanas algoritma ieviešanai:

 #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; } 

Izvade:


Atšķiriet DDA algoritmu un Brezenhemas līnijas algoritmu:

DDA algoritms Bresenhemas līnijas algoritms
1. DDA algoritms izmanto peldošo komatu, t.i., reālo aritmētiku. 1. Brezenhemas līnijas algoritms izmanto fiksēto punktu, t.i., veselo skaitļu aritmētiku
2. DDA algoritmi izmanto reizināšanu un dalīšanu 2. Bresenham's Line Algorithm izmanto tikai atņemšanu un saskaitīšanu tā darbību
3. DDA algoritms līniju zīmēšanā ir lēnāks nekā Brezenhemas līnijas algoritms, jo tajā tiek izmantota reāla aritmētika (peldošā komata darbība). 3. Bresenham algoritms ir ātrāks nekā DDA algoritms, jo tā aprēķinā ir iekļauta tikai saskaitīšana un atņemšana un tiek izmantota tikai veselu skaitļu aritmētika.
4. DDA algoritms nav precīzs un efektīvs kā Brezenhemas līnijas algoritms. 4. Bresenham's Line Algorithm ir precīzāks un efektīvāks DDA algoritmā.
5.DDA algoritms var zīmēt apli un līknes, bet nav precīzs kā Brezenhemas līnijas algoritms 5. Bresenham's Line Algorithm var zīmēt apli un līknes ar precīzāk nekā DDA algoritms.