Skaitmeninis diferencinis algoritmas (DDA) ir Bresenhamso algoritmas yra skaitmeninių linijų brėžimo algoritmai ir kompiuterinėje grafikoje naudojami paveikslams piešti. Anksčiau pikseliams apskaičiuoti naudojome analitinius analizatorius, todėl buvo galima sudaryti brėžinius. Bet šie analizės metodai nėra tokie tikslūs kaip skaitmeniniai metodai, kad naudodamiesi šiais skaitmeniniais algoritmais, kaip ir kiekvienoje srityje, mes išradome aukštesnės kokybės metodus ir kompiuterinėje grafikoje. Šių algoritmų išradimas yra puikus pavyzdys. Prieš tęsdami, pažvelkime į šių algoritmų idėją. Nors atrodo, kad tai nėra mūsų diskusijos sritis, labai svarbu nurodyti pagrindinius skirtumus. Jei esate tikrai susipažinęs su algoritmais, galite pereiti prie faktinių skirtumų, esančių šio puslapio pabaigoje.
DDA dažniausiai naudojamas brėžti linijas kompiuterinėje grafikoje ir naudoja tikrąsias vertes numatant kitas pikselių reikšmes. Tarkime, kad pradinė taškų reikšmė yra (X0, Y0) (X0, Y0), o paskirties taškas - (X1, Y1) (X1, Y1). Išmoksime, kaip apskaičiuoti paskirties taškų vertes iš žinomos vaizdo elementų vertės (X0, Y0) (X0, Y0), kaip nurodyta toliau.
1 žingsnis: Čia turime įvestį (X0, Y0) (X0, Y0) ir turėtume nustatyti, ar linija eina lygiagrečiai x ašiai, ar y ašiai. Norėdami tai sužinoti, dabar apskaičiuokime skirtumą tarp pradinės ir paskirties taškų vertės.
dx = X1 - X0
dy = Y1 - Y0
2 žingsnis: Dabar mes nustatėme skirtumą ir turėtume nubrėžti liniją išilgai x ašies, jei 'dx' lygus nuliui, liniją turėtume nubrėžti lygiagrečiai y ašiai. Čia yra faktinis skaičiavimas kompiuterio kalba.
if (absoliutus (dx)> absoliutus (dy))
Žingsniai = absoliutus (dx);
Kitas
Žingsniai = absoliutus (dy);
3 žingsnis: Atėjo laikas nustatyti tikrąją „x“ koordinatę arba „y“ koordinačių taškų vertes, kad būtų nubrėžta linija.
X žingsnis = dx / (plūduriuojantys) žingsniai;
Y prieaugis = dy / (plūduriuojantys) žingsniai;
4 žingsnis: Tai turi būti apskaičiuota, kol pasieksime paskirties tašką. DDA algoritmas skaičiuodamas tašką padidina tašką iki artimiausio sveikojo skaičiaus. Čia yra kodo pavyzdys to, ką dabar aptarėme.
Dėl (int v = 0; v < Steps; v++)
x = x + X priedas;
y = y + Y priedas;
putpikselis (apvalus (x), apvalus (y));
Baigėme brėžti liniją naudodamiesi DDA ir pereikime prie „Bresenham“ dabar!
Tai taip pat yra skaitmeninių linijų brėžimo algoritmas, kurį išrado Bresenham 1962 m., Todėl jis ir gavo tą patį pavadinimą. Šis algoritmas yra tikslesnis ir, naudodamas atimtį ir papildymą, skaičiuodamas pikselio vertę brėžė liniją. Bresenhamo algoritmo tikslumas yra patikimas ir braižant kreives bei apskritimus. Pažvelkime, kaip veikia šis algoritmas.
1 žingsnis: Bresenhamo algoritmai pradinę pikselių koordinatę laiko (xa + 1, ya).
2 žingsnis: Jis automatiškai apskaičiuoja kito taško vertę kaip (xa + 1, ya + 1), Čia „a“ yra prieauginė reikšmė, o algoritmas ją apskaičiuoja pridėdamas arba atimdamas lygtis, kurias sudarė.
Šis algoritmas apskaičiuoja tikslias vertes be apvalinimo ir atrodo lengviau!
Panagrinėkime taškus (0,0) ir (-8, -4) ir nubrėžkime liniją tarp šių taškų naudodamiesi Bresenhamo algoritmu..
Pateikti duomenys, (x1, y1) = (0, 0) ir (x2, y2) = (-8, -4).
Dabar apskaičiuokime diferencines vertes, kaip nurodyta toliau.
∆x = x2-x1 = -8-0 = 8
Todėl padidėjimo reikšmė x = ∆x / x2 = 8 / -8 = -1.
∆y = y2-y1 = -4-0 = 4
Todėl padidėjimo reikšmė y = ∆y / y2 = 4 / -4 = -1.
Sprendimo kintamasis = e = 2 * (∆y) - (∆x)
Todėl e = 2 * (4) - (8) = 8-8 = 0
Atlikdami aukščiau pateiktus skaičiavimus, pateikime gautų verčių lentelę. Y koordinatės vertės yra pakoreguotos remiantis sprendimo kintamuoju ir mes tiesiog nekreipiame dėmesio į jos skaičiavimą.
Pikselis | x | y | Sprendimo kintamasis |
(0,0) | 0 | 0 | 0 |
(-1,0) | -1 | 0 | Vertė |
(-2, -1) | -2 | -1 | 0 |
(-3, -1) | -3 | -1 | Vertė |
(-4, -2) | -4 | -2 | 0 |
(-5, -2) | -5 | -2 | Vertė |
(-6, -3) | -6 | -3 | 0 |
(-7, -3) | -7 | -3 | Vertė |
(-8, -4) | -8 | -4 | 0 |
DDA skaičiavimuose naudoja tikrąsias vertes, naudodama slankiojo kablelio reikšmes. Kitos taškų arba taškų vertės nustatomos diferencialinėmis lygtimis
X žingsnis = dx / (plūduriuojantys) žingsniai
Y priedas = dy / (plūduriuojantys) žingsniai
Čia nenaudojamos fiksuotosios konstantos, tačiau Bresenhamo algoritme fiksuoti taškai naudojami aritmetiniuose skaičiavimuose. Bresenhamo algoritmas naudoja Integer aritmetiką, skirtingai nei DDA.
DDA diferencialines lygtis išsprendžia daugybos ir padalijimo operacijomis. Galėjote pastebėti tą patį čia, X žingsnis = dx / (plūduriuojantis) žingsniai. Bresenhamo algoritmas naudoja sudėjimo ir atimties operacijas, ir jūs galite tai pastebėti kitoje pikselių vertės apskaičiavimo lygtyje (xa + 1, ya + 1). Bresenhamo aritmetika yra paprastesnė, palyginti su DDA.
Kaip jau aptarėme anksčiau, Bresenhamo algoritmas naudoja paprastesnę aritmetinę nei DDA ir tai duoda efektyvius rezultatus.
X žingsnis = dx / (plūduriuojantys) žingsniai
Galėjote pastebėti „plūdę“, todėl ji reikšmių neapvalina, o Bresenhamo algoritmas apvalina reikšmes iki artimiausio sveikojo skaičiaus. Todėl naudojamos reikšmės yra paprastesnės Bresenhamo algoritme.
DDA gali brėžti apskritimus ir kreives, išskyrus brėžimo linijas. Bresenhamo algoritmas taip pat sugeba nubrėžti visus aukščiau paminėtus, o jo tikslumas yra tikrai didesnis nei DDA. Panašiai Bresenhamo algoritmas galėtų sugalvoti efektyvias kreives, nei tas, kurias sukuria DDA. Abu algoritmai taip pat gali sudaryti trikampius ir daugiakampius.
Kadangi DDA taip pat apima apvalinimą, tai yra brangu, nei naudoti Bresenhamo algoritmą.
Iš mūsų aukščiau pateiktos diskusijos labai aišku, kad Bresenhamo algoritmas yra optimizuotas atsižvelgiant į operacijų greitį, kainą ir naudojimą..
Pažvelkime į lentelės formos skirtumus.
S.Ne | Skirtumai | Skaitmeninis diferencialinis algoritmas | Bresenhamo algoritmas |
1. | Kodėl vardas? | Tiesiog todėl, kad tai buvo skaitmeninis lygčių įgyvendinimas, ji gavo pavadinimą. | Jį išrado J. E. Bresenham 1962 m., Taigi ir vardas. |
2. | Skaičiavimai | Tai apima griežtesnius skaičiavimus. | Naudojami skaičiavimai yra tikrai paprastesni. |
3. | Naudojamų operacijų rūšys | Tai buvo naudojama daugyba ir padalijimas. Čia naudojamos pavyzdžių diferencialinės lygtys yra Xincrement = dx / (float) žingsniai, Yincrement = dy / (plūdės) žingsniai.
| Jis naudoja papildymus ir atimtis. Imties skaičiavimas čia gali būti žymimas taip (xa + 1, ya + 1). |
4. | Aritmetinės skaičiavimo vertės | Tam naudojamos slankiojo kablelio vertės. | Tam naudojamos tik sveikosios vertės. |
5. | Efektyvumas | Sudėtingas aritmetinis efektyvumas yra mažesnis. | Paprastesnė aritmetika lemia didesnį efektyvumą. |
6. | Greitis | Daugybos ir dalijimo operacijų panaudojimas skaičiavimo procesams užima daug laiko. | Sudėties ir atimties operacijų naudojimas užtrunka mažiau nei DDA. |
7. | Tikslumas | Tai mažesnio tikslumo. | Tiksliau. |
8. | Apvalinimas | Jis naudoja tikrąsias vertybes ir niekada apvalina vertes. | Tai apvalina reikšmes iki artimiausių sveikųjų skaičių. |
9. | Piešimo galimybės | Jis gali brėžti linijas, apskritimus ir kreives, tačiau mažesniu tikslumu. Šiuo algoritmu galime nubrėžti net trikampius ir daugiakampius. | Jis gali efektyviau brėžti linijas, apskritimus ir kreives. Šiuo algoritmu taip pat galima nubrėžti trikampius ir daugiakampius. |
10. | Skaičiavimų išlaidos | Tai brangu, nes apima ir apvalinimą. | Bresenhamo algoritmo naudojimas yra pigesnis nei DDA. |
11. | Optimizuotas algoritmas | Tai nėra optimizuotas algoritmas | Tai yra optimizuotas algoritmas. |
Mes išsprendėme visus įmanomus DDA ir Bresenham algoritmo skirtumus. Gali atrodyti, kad tai kartojasi, tačiau yra pagrįsta priežastis tuos dalykus paminėti dar kartą ir jūs sužinotumėte, kai tai visiškai suprastumėte. Jei vis tiek manote, kad egzistuoja dviprasmybė, palikite mums komentarą. Mokykimės kartu pasidalydami tinkamomis žiniomis!