Š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
- Vai nu pa labi (līnijas apakšējā robeža)
- 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'.
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
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 Aizstājot m ar un ieviešot lēmumu mainīgo kur c= 2△y+△x (2b-1) Varam uzrakstīt lēmuma mainīgo di+1uz nākamo slīdēšanu Tā kā x_(i+1)=xi+1, mums ir Īpaši gadījumi Ja izvēlētais pikselis atrodas augšējā pikselī T (t.i., di≧0)⟹ uni+1=yi+1 Ja izvēlētais pikselis atrodas apakšējā pikselī T (t.i., di<0)⟹ yi+1=yi Visbeidzot, mēs aprēķinām d1 Kopš mx1+b-yi=0 un m = , mums ir 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. 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. 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 4. darbība: Aprēķināt dx = x2-x1 5. darbība: Apsveriet (x, y) par sākuma punktu un xbeigaskā maksimālo iespējamo x vērtību. 6. darbība: Ģenerēt punktu pie (x,y) koordinātām. 7. darbība: Pārbaudiet, vai ir izveidota visa rinda. 8. darbība: Aprēķināt nākamā pikseļa koordinātas 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 Izvade:
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1
di=△x (s-t)
di=△x (2 (xi+1)+2b-2gi-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.yi+c
di+1=2△y.xi+1-2△x.yi+1+c
di+1-di=2△y.(xi+1-xi)- 2△x(yi+1-uni)
di+1+di=2△y.(xi+1-xi)- 2△x(yi+1-uni)
di+1=di+2△y-2△x
di+1=di+2△ g0)⟹>
d1=△x[2m(x1+1)+2b-2g1-1]
d1=△x[2(mx1+b-y1)+2m-1]
d1=2△y-△xPriekšrocība:
Trūkums:
Bresenhemas līnijas algoritms:
Kur x1,un1ir sākuma punkta koordinātas
Un x2,un2ir beigu punkta koordinātas
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
Ja dx<0
Tad x = x2
y = y2
xbeigas=x1
Ja dx > 0
Tad x = x1
y = y1
xbeigas=x20>
Ja x > = xbeigas
Stop.lateksa matrica
Ja d<0
Tad d = d + i1
Ja d ≧ 0
Tad d = d + i2
Palieliniet y = y + 10>
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(&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; }
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.