logo

Bresenhamo linijos algoritmas

Šis algoritmas naudojamas nuskaitymui konvertuojant eilutę. Jį sukūrė Bresenhamas. Tai efektyvus metodas, nes jis apima tik sveikųjų skaičių sudėjimo, atimties ir daugybos operacijas. Šios operacijos gali būti atliekamos labai greitai, todėl greitai galima sukurti linijas.

Taikant šį metodą, kitas pasirenkamas taškas, turintis mažiausią atstumą nuo tikrosios linijos.

Metodas veikia taip:

Tarkime, pikselis P1'(x1', ir1'), tada pasirinkite tolesnius pikselius, kai dirbame nuo gegužės iki nakties, po vieną pikselio padėtį horizontalia kryptimi link P2'(x2', ir2').

Kai tik pikselis, pasirinkite bet kuriuo žingsniu

Kitas pikselis yra

  1. Dešinėje esanti (apatinė eilutės riba)
  2. Vienas viršuje yra dešinėn ir aukštyn (viršutinė eilutės riba)

Liniją geriausiai apytiksliai nustato tie pikseliai, kurie mažiausią atstumą nukrenta nuo kelio tarp P1', P2“.

Bresenhamas

Norėdami pasirinkti kitą tarp apatinio taško S ir viršutinio pikselio T.
Jei pasirinktas S
Mes turime xaš+1=xi+1 ir yaš+1=yi
Jei pasirinktas T
Mes turime xaš+1=xi+1 ir yaš+1=yi+1

Tiesės, esančios x = x, tikrosios y koordinatėsaš+1yra
y=mxaš+1+b

Bresenhamas

Atstumas nuo S iki tikrosios linijos y kryptimi
s = y-yi

Atstumas nuo T iki tikrosios linijos y kryptimi
t = (yi+1)-y

Dabar apsvarstykite skirtumą tarp šių dviejų atstumo verčių
s - t

Kada (s-t)<0 ⟹ s < t< p>

Artimiausias pikselis yra S

Kai (s-t) ≧0 ⟹ s

Artimiausias pikselis yra T

Šis skirtumas yra
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1

Bresenhamas

Pakeičiant m Bresenhamasir įvedant sprendimo kintamąjį
di=△x (s-t)
di=△x (2 Bresenhamas(xi+1)+2b-2mi-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.yi+c

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

Galime parašyti sprendimo kintamąjį daš+1už kitą slydimą
daš+1=2△y.xaš+1-2△x.yaš+1+c
daš+1-di=2△y.(xaš+1-xi)- 2△x(yaš+1- iri)

Kadangi x_(i+1)=xi+1, turime
daš+1+di=2△y.(xi+1-xi)- 2△x(yaš+1- iri)

Ypatingi atvejai

Jei pasirinktas pikselis yra viršutiniame pikselyje T (t. y. di≧0)⟹ iraš+1=yi+1
daš+1=di+2△y-2△x

Jei pasirinktas pikselis yra apatiniame pikselyje T (t. y. di<0)⟹ yi+1=yi
daš+1=di+2△m

Galiausiai apskaičiuojame d1
d1=△x[2m(x1+1)+2b-2m1-1]
d1=△x[2(mx1+b-y1)+2m-1]

Nuo mx1+b-yi=0 ir m = , mes turime
d1=2△y-△x

Privalumas:

1. Ji apima tik sveikųjų skaičių aritmetiką, todėl ji yra paprasta.

2. Taip išvengiama pasikartojančių taškų generavimo.

3. Jis gali būti įgyvendintas naudojant techninę įrangą, nes nenaudoja daugybos ir dalybos.

4. Jis yra greitesnis, palyginti su DDA (skaitmeniniu diferencialiniu analizatoriumi), nes neapima slankiojo kablelio skaičiavimų, tokių kaip DDA algoritmas.

Trūkumas:

1. Šis algoritmas skirtas tik pagrindiniam linijų braižymui Inicijuoti nėra Bresenhamo linijų algoritmo dalis. Taigi, norėdami nubrėžti lygias linijas, turėtumėte pažvelgti į kitą algoritmą.

Bresenhamo linijos algoritmas:

1 žingsnis: Pradėti algoritmą

kino aktorė Kajal

2 žingsnis: Deklaruoti kintamąjį x1,x2, ir1, ir2,d,i1,t.y2,dx,dy

3 veiksmas: Įveskite x reikšmę1, ir1,x2, ir2
Kur x1, ir1yra pradinio taško koordinatės
Ir x2, ir2yra pabaigos taško koordinatės

4 veiksmas: Apskaičiuokite dx = x2-x1
Apskaičiuokite dy = y2- ir1
Apskaičiuokite i1=2*tu
Apskaičiuokite i2=2*(dy-dx)
Apskaičiuokite d=i1-dx

5 veiksmas: Apsvarstykite (x, y) kaip pradžios tašką ir xgalaskaip didžiausia galima x reikšmė.
Jei dx<0
Tada x = x2
y = y2
xgalas=x1
Jei dx > 0
Tada x = x1
y = y1
xgalas=x2

6 veiksmas: Sukurkite tašką (x,y) koordinatėse.

7 veiksmas: Patikrinkite, ar sugeneruota visa eilutė.
Jei x > = xgalas
Sustabdyti.

8 veiksmas: Apskaičiuokite kito pikselio koordinates
Jei d<0
Tada d = d + i1
Jei d ≧ 0
Tada d = d + i2
Padidinkite y = y + 1

9 veiksmas: Padidinkite x = x + 1

10 veiksmas: Nubrėžkite naujausių (x, y) koordinačių tašką

11 veiksmas: Eikite į 7 veiksmą

12 veiksmas: Algoritmo pabaiga

Pavyzdys: Linijos pradžios ir pabaigos padėtis yra (1, 1) ir (8, 5). Raskite tarpinius taškus.

Sprendimas: x1=1
ir1=1
x2=8
ir2=5
dx = x2-x1=8-1=7
tu=y2- ir1=5-1=4
1=2* ∆y=2*4=8
2=2*(∆y-∆x)=2*(4-7)=-6
d = I1-∆x=8-7=1

x ir d=d+I1ar aš2
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

Programa, skirta įgyvendinti Bresenhamo linijų braižymo algoritmą:

 #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; } 

Išvestis:


Atskirkite DDA algoritmą nuo Bresenhamo linijos algoritmo:

DDA algoritmas Bresenhamo linijos algoritmas
1. DDA algoritmas naudoja slankųjį kablelį, t. y. tikrąją aritmetiką. 1. Bresenhamo linijos algoritmas naudoja fiksuotąjį tašką, t. y. sveikųjų skaičių aritmetiką
2. DDA algoritmai naudoja daugybos ir padalijimo operacijas 2. Bresenhamo linijos algoritmas naudoja tik atimtį ir sudėjimą
3. DDA algoritmas yra lėtesnis už Bresenhamo linijinį algoritmą, nes jis naudoja tikrą aritmetiką (slankiojo kablelio operacija) 3. Bresenhamo algoritmas yra greitesnis nei DDA algoritmas, nes skaičiuojant naudojamas tik sudėjimas ir atėmimas ir naudojama tik sveikųjų skaičių aritmetika.
4. DDA algoritmas nėra tikslus ir efektyvus kaip Bresenhamo linijos algoritmas. 4. Bresenhamo linijos algoritmas yra tikslesnis ir efektyvesnis naudojant DDA algoritmą.
5.DDA algoritmas gali nubrėžti apskritimą ir kreives, bet nėra tikslus kaip Bresenhamo linijos algoritmas 5. Bresenhamo linijos algoritmas gali nubrėžti apskritimą ir kreives tiksliau nei DDA algoritmas.