logo

Bresenham vonalalgoritmusa

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

  1. Vagy a tőle jobbra eső (a vonal alsó korlátja)
  2. 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'.

Bresenham

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

Bresenham

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

Bresenham

m-t helyettesítve Bresenhamés döntési változó bevezetése
dén=△x (s-t)
dén=△x (2 Bresenham(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+c

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

java end for ciklus

Felírhatjuk a d döntési változóti+1a következő csúszáshoz
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)

Mivel x_(i+1)=xén+1, megvan
di+1+dén=2△y.(xén+1-xén)- 2△x(yi+1-ésén)

Különleges esetek

Ha a kiválasztott pixel a felső T pixelnél van (azaz dén≧0)⟹ ési+1=yén+1
di+1=dén+2△y-2△x

Ha a kiválasztott pixel az alsó T pixelben van (azaz dén<0)⟹ yi+1=yén
di+1=dén+2△y

Végül kiszámoljuk d1
d1=△x[2m(x1+1)+2b-2y1-1]
d1=△x[2(mx1+b-y1)+2m-1]

Mivel mx1+b-yén=0 és m = , nekünk van
d1=2△y-△x

Előny:

1. Csak egész számot tartalmaz, tehát egyszerű.

c program string tömb

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.

Hátrány:

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.

rendfa bejárás

Bresenham vonal algoritmusa:

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
Ahol x1,és1a kezdőpont koordinátái
És x2,és2a végpont koordinátái

4. lépés: Számítsd ki dx = x2-x1
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

5. lépés: Tekintsük (x, y) kezdőpontnak és x-nekvégemint lehetséges x maximális értéke.
Ha dx<0
Ekkor x = x2
y = y2
xvége=x1
Ha dx > 0
Ekkor x = x1
y = y1
xvége=x2

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.
Ha x > = xvége
Állj meg.

8. lépés: Számítsa ki a következő pixel koordinátáit
Ha d<0
Ekkor d = d + i1
Ha d ≧ 0
Ekkor d = d + i2
Növekedés y = y + 1

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
é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=1

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

Kimenet:


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.