Bresenham vonalalgoritmusa

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 pixelt 1 '(x 1 ',és 1 '), 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 '(x 2 ',és 2 ').

Ha egy pixel van, bármelyik lépésben választhat

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

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 van i+1 =x én +1 és y i+1 =y én
Ha T választja
Nekünk x van i+1 =x én +1 és y i+1 =y én +1

Az x = x pontban lévő egyenes tényleges y koordinátái i+1 van
y=mx i+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)

Felírhatjuk a d döntési változót i+1 a következő csúszáshoz
d i+1 =2△y.x i+1 -2△x.y i+1 +c
d i+1 -d én =2△y.(x i+1 -x én )- 2△x(y i+1 -és én )

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

Különleges esetek

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

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

Végül kiszámoljuk d 1
d 1 =△x[2m(x 1 +1)+2b-2y 1 -1]
d 1 =△x[2(mx 1 +b-y 1 )+2m-1]

Mivel mx 1 +b-y én =0 és m = , nekünk van
d 1 =2△y-△x

Előny:

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.

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.

Bresenham vonal algoritmusa:

1. lépés: Algoritmus indítása

2. lépés: Az x változó deklarálása 1 ,x 2 ,és 1 ,és 2 ,d,i 1 ,én 2 ,dx,dy

3. lépés: Adja meg x értékét 1 ,és 1 ,x 2 ,és 2
Ahol x 1 ,és 1 a kezdőpont koordinátái
És x 2 ,és 2 a végpont koordinátái

4. lépés: Számítsd ki dx = x 2 -x 1
Számítsa ki dy = y 2 -és 1
Számítsa ki az i 1 =2*te
Számítsa ki az i 2 =2*(dy-dx)
Számítsd ki d=i 1 -dx

5. lépés: Tekintsük (x, y) kezdőpontnak és x-nek vége mint lehetséges x maximális értéke.
Ha dx <0
Ekkor x = x 2
y = y 2
x vége =x 1
Ha dx > 0
Ekkor x = x 1
y = y 1
x vége =x 2

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

8. lépés: Számítsa ki a következő pixel koordinátáit
Ha d <0
Ekkor d = d + i 1
Ha d ≧ 0
Ekkor d = d + i 2
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: x 1 =1
és 1 =1
x 2 =8
és 2 =5
dx= x 2 -x 1 =8-1=7
te=y 2 -és 1 =5-1=4
én 1 =2* ∆y=2*4=8
én 2 =2*(∆y-∆x)=2*(4-7)=-6
d = I 1 -∆x=8-7=1

x és d=d+I 1 vagy én 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

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.