Ez az algoritmus egy vonal letapogatására szolgál. Bresenham fejlesztette ki. Ez egy hatékony módszer, mert csak egész számok összeadását, kivonását és szorzási műveleteit tartalmazza. Ezek a műveletek nagyon gyorsan végrehajthatók, így a vonalak gyorsan generálhatók.
Ennél a módszernél a következő képpont az lesz, amelyiknek a legkisebb távolsága van a valódi vonaltól.
A módszer a következőképpen működik:
Tételezzünk fel egy P pixelt1'(x1',és1'), majd válasszuk ki a következő képpontokat, ahogy májustól éjszakáig dolgozunk, egy-egy pixel pozícióban vízszintes irányban P felé2'(x2',és2').
Ha egy pixel van, bármelyik lépésben választhat
ipconfig ubuntuhoz
A következő pixel az
- Vagy a tőle jobbra eső (a vonal alsó korlátja)
- Az egyik jobbra fent és felfelé (a vonal felső határa)
A vonalat azokkal a képpontokkal lehet a legjobban közelíteni, amelyek a legkisebb távolságra esnek a P közötti útvonaltól1', P2'.
A To kiválasztja a következőt az alsó S pixel és a felső T pixel között.
Ha S-t választjuk
Nekünk x vani+1=xén+1 és yi+1=yén
Ha T választja
Nekünk x vani+1=xén+1 és yi+1=yén+1
Az x = x pontban lévő egyenes tényleges y koordinátáii+1van
y=mxi+1+b
Az S-től a tényleges egyenesig mért távolság y irányban
s = y-yén
A távolság T-től a tényleges egyenesig y irányban
t = (yén+1)-y
Most nézzük meg a különbséget a két távolságérték között
utca
Mikor (s-t)<0 ⟹ s < t< p>
A legközelebbi pixel az S
Amikor (s-t) ≧0 ⟹ s A legközelebbi pixel a T Ez a különbség az m-t helyettesítve és döntési változó bevezetése ahol c= 2△y+△x (2b-1) Felírhatjuk a d döntési változóti+1a következő csúszáshoz Mivel x_(i+1)=xén+1, megvan Különleges esetek Ha a kiválasztott pixel a felső T pixelnél van (azaz dén≧0)⟹ ési+1=yén+1 Ha a kiválasztott pixel az alsó T pixelben van (azaz dén<0)⟹ yi+1=yén Végül kiszámoljuk d1 Mivel mx1+b-yén=0 és m = , nekünk van 1. Csak egész számot tartalmaz, tehát egyszerű. 2. Elkerüli az ismétlődő pontok generálását. 3. Hardverrel megvalósítható, mert nem használ szorzást és osztást. 4. Gyorsabb a DDA-hoz (Digital Differential Analyzer) képest, mivel nem tartalmaz olyan lebegőpontos számításokat, mint a DDA algoritmus. 1. Ez az algoritmus csak alapvető vonalvezetésre szolgál. Az inicializálás nem része a Bresenham-féle vonalalgoritmusnak. Tehát a sima vonalak rajzolásához érdemes egy másik algoritmust megvizsgálni. 1. lépés: Algoritmus indítása 2. lépés: Az x változó deklarálása1,x2,és1,és2,d,i1,én2,dx,dy 3. lépés: Adja meg x értékét1,és1,x2,és2 4. lépés: Számítsd ki dx = x2-x1 5. lépés: Tekintsük (x, y) kezdőpontnak és x-nekvégemint lehetséges x maximális értéke. 6. lépés: Pont generálása (x,y) koordinátákon. 7. lépés: Ellenőrizze, hogy létrejött-e a teljes sor. 8. lépés: Számítsa ki a következő pixel koordinátáit 9. lépés: Növekedés x = x + 1 10. lépés: Rajzolj egy pontot a legújabb (x, y) koordinátákkal 11. lépés: Folytassa a 7. lépéssel 12. lépés: Algoritmus vége Példa: A sor kezdő és végpontja (1, 1) és (8, 5). Keresse meg a közbenső pontokat. Megoldás: x1=1 Kimenet:
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1
dén=△x (s-t)
dén=△x (2 (xén+1)+2b-2yén-1)
=2△xyén-2△y-1△x.2b-2yén△x-△x
dén=2△y.xén-2△x.yén+cjava end for ciklus
di+1=2△y.xi+1-2△x.yi+1+c
di+1-dén=2△y.(xi+1-xén)- 2△x(yi+1-ésén)
di+1+dén=2△y.(xén+1-xén)- 2△x(yi+1-ésén)
di+1=dén+2△y-2△x
di+1=dén+2△y0)⟹>
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-y1)+2m-1]
d1=2△y-△xElőny:
c program string tömb
Hátrány:
rendfa bejárás
Bresenham vonal algoritmusa:
Ahol x1,és1a kezdőpont koordinátái
És x2,és2a végpont koordinátái
Számítsa ki dy = y2-és1
Számítsa ki az i1=2*te
Számítsa ki az i2=2*(dy-dx)
Számítsd ki d=i1-dx
Ha dx<0
Ekkor x = x2
y = y2
xvége=x1
Ha dx > 0
Ekkor x = x1
y = y1
xvége=x20>
Ha x > = xvége
Állj meg.
Ha d<0
Ekkor d = d + i1
Ha d ≧ 0
Ekkor d = d + i2
Növekedés y = y + 10>
és1=1
x2=8
és2=5
dx= x2-x1=8-1=7
te=y2-és1=5-1=4
én1=2* ∆y=2*4=8
én2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1java karakterlánc formátum
x és d=d+I1vagy én2 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 Program a Bresenham-féle vonalrajzolási algoritmus megvalósításához:
#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; }
Tegyen különbséget a DDA algoritmus és a Bresenham-féle vonalalgoritmus között:
DDA algoritmus Bresenham vonalalgoritmusa 1. A DDA algoritmus lebegőpontos, azaz valós aritmetikát használ. 1. A Bresenham-féle vonalalgoritmus fix pontot, azaz egész számot használ 2. A DDA algoritmusok szorzást és osztást használnak a működéséhez 2. A Bresenham-féle vonalalgoritmus csak a kivonást és az összeadást használja 3. A DDA algoritmus lassabb, mint a Bresenham-féle vonalalgoritmus a vonalrajzolásban, mert valós aritmetikát használ (lebegőpontos művelet) 3. A Bresenham-algoritmus gyorsabb, mint a DDA-algoritmus, mivel csak összeadást és kivonást tartalmaz a számításban, és csak egész számokat használ. 4. A DDA algoritmus nem pontos és nem hatékony, mint a Bresenham-féle vonalalgoritmus. 4. A Bresenham-féle vonalalgoritmus pontosabb és hatékonyabb a DDA algoritmusnál. 5. A DDA algoritmus képes köröket és görbéket rajzolni, de nem pontos, mint a Bresenham-féle vonalalgoritmus 5. A Bresenham-féle vonalalgoritmus pontosabban tud kört és görbéket rajzolni, mint a DDA algoritmus.