Bresenhemas līnijas algoritms

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.

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 P 1 '(x 1 ',un 1 '), 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 P 2 '(x 2 ',un 2 ').

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 P 1 ', P 2 '.

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 x i+1 =x i +1 un y i+1 =y i
Ja izvēlēts T
Mums ir x i+1 =x i +1 un y i+1 =y i +1

Taisnes faktiskās y koordinātas pie x = x i+1 ir
y=mx i+1 +b

Brezenhema

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

Attālums no T līdz faktiskajai līnijai y virzienā
t = (y i +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
d i =△x (s-t)
d i =△x (2 Brezenhema(x i +1)+2b-2g 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

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

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

Tā kā x_(i+1)=x i +1, mums ir
d i+1 +d i =2△y.(x i +1-x i )- 2△x(y i+1 -un i )

Īpaši gadījumi

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

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

Visbeidzot, mēs aprēķinām d 1
d 1 =△x[2m(x 1 +1)+2b-2g 1 -1]
d 1 =△x[2(mx 1 +b-y 1 )+2m-1]

Kopš mx 1 +b-y i =0 un m = , mums ir
d 1 =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 x 1 ,x 2 ,un 1 ,un 2 ,d,i 1 ,t.i 2 ,dx,dy

3. darbība: Ievadiet x vērtību 1 ,un 1 ,x 2 ,un 2
Kur x 1 ,un 1 ir sākuma punkta koordinātas
Un x 2 ,un 2 ir beigu punkta koordinātas

4. darbība: Aprēķināt dx = x 2 -x 1
Aprēķināt dy = y 2 -un 1
Aprēķināt i 1 =2*tu
Aprēķināt i 2 =2*(dy-dx)
Aprēķināt d=i 1 -dx

5. darbība: Apsveriet (x, y) par sākuma punktu un x beigas kā maksimālo iespējamo x vērtību.
Ja dx <0
Tad x = x 2
y = y 2
x beigas =x 1
Ja dx > 0
Tad x = x 1
y = y 1
x beigas =x 2

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

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

8. darbība: Aprēķināt nākamā pikseļa koordinātas
Ja d <0
Tad d = d + i 1
Ja d ≧ 0
Tad d = d + i 2
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: x 1 =1
un 1 =1
x 2 =8
un 2 =5
dx = x 2 -x 1 =8-1=7
tu=y 2 -un 1 =5-1=4
es 1 =2* ∆y=2*4=8
es 2 =2*(∆y-∆x)=2*(4-7)=-6
d = I 1 -∆x=8-7=1

x un d=d+I 1 vai es 2
1 1 d+I 2 =1+(-6)=-5
2 2 d+I 1 =-5+8=3
3 2 d+I 2 =3+(-6)=-3
4 3 d+I 1 =-3+8=5
5 3 d+I 2 =5+(-6)=-1
6 4 d+I 1 =-1+8=7
7 4 d+I 2 =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.