Š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
- Dešinėje esanti (apatinė eilutės riba)
- 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“.
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
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 Pakeičiant m ir įvedant sprendimo kintamąjį kur c = 2△y+△x (2b-1) Galime parašyti sprendimo kintamąjį daš+1už kitą slydimą Kadangi x_(i+1)=xi+1, turime Ypatingi atvejai Jei pasirinktas pikselis yra viršutiniame pikselyje T (t. y. di≧0)⟹ iraš+1=yi+1 Jei pasirinktas pikselis yra apatiniame pikselyje T (t. y. di<0)⟹ yi+1=yi Galiausiai apskaičiuojame d1 Nuo mx1+b-yi=0 ir m = , mes turime 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. 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ą. 1 žingsnis: Pradėti algoritmą 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 4 veiksmas: Apskaičiuokite dx = x2-x1 5 veiksmas: Apsvarstykite (x, y) kaip pradžios tašką ir xgalaskaip didžiausia galima x reikšmė. 6 veiksmas: Sukurkite tašką (x,y) koordinatėse. 7 veiksmas: Patikrinkite, ar sugeneruota visa eilutė. 8 veiksmas: Apskaičiuokite kito pikselio koordinates 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 Išvestis:
s-t = (y-yi)-[(yi+1)-y]
= 2y - 2yi -1
di=△x (s-t)
di=△x (2 (xi+1)+2b-2mi-1)
=2△xyi-2△y-1△x.2b-2yi△x-△x
di=2△y.xi-2△x.yi+c
daš+1=2△y.xaš+1-2△x.yaš+1+c
daš+1-di=2△y.(xaš+1-xi)- 2△x(yaš+1- iri)
daš+1+di=2△y.(xi+1-xi)- 2△x(yaš+1- iri)
daš+1=di+2△y-2△x
daš+1=di+2△m0)⟹>
d1=△x[2m(x1+1)+2b-2m1-1]
d1=△x[2(mx1+b-y1)+2m-1]
d1=2△y-△xPrivalumas:
Trūkumas:
Bresenhamo linijos algoritmas:
kino aktorė Kajal
Kur x1, ir1yra pradinio taško koordinatės
Ir x2, ir2yra pabaigos taško koordinatės
Apskaičiuokite dy = y2- ir1
Apskaičiuokite i1=2*tu
Apskaičiuokite i2=2*(dy-dx)
Apskaičiuokite d=i1-dx
Jei dx<0
Tada x = x2
y = y2
xgalas=x1
Jei dx > 0
Tada x = x1
y = y1
xgalas=x20>
Jei x > = xgalas
Sustabdyti.
Jei d<0
Tada d = d + i1
Jei d ≧ 0
Tada d = d + i2
Padidinkite y = y + 10>
ir1=1
x2=8
ir2=5
dx = x2-x1=8-1=7
tu=y2- ir1=5-1=4
aš1=2* ∆y=2*4=8
aš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(&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; }
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.