mike na hračke

som spektrista

Landscape generator

2012-02-14 od mikezt

Logout na svojom blogu uverejnil výborný článok o generovaní krajiniek v Basicu. Článok treba len pochváliť, pretože popisuje jednoduché (chcem sa vyhnúť označeniu primitívne) algoritmy, ktoré generujú naozaj pekné krajinky. To mi pripomenulo algoritmus, ku ktorému som sa dostal už strašne dávno a nikdy som si ho nevyskúšal. Preto som sadol k emulátoru a začal uvažovať

graf

Keďže Logoutov blog pojednával o algoritmoch v Basicu, tak som najprv uvažoval, že si môj algoritmus napíšem práve v Basicu. Algoritmus je vcelku jednoduchý - najprv si treba vygenerovať krajné dva body krajiny a potom rekurzívne vypočítať stredný bod tak, že sa vypočíta priemerná hodnota (teda hodnota v strede úsečky spájajúcej krajné body, viz. obrázok) a k nej sa pripočíta náhodná hodnota podelená druhou mocninou hĺbky rekurzie. Znie to jednoducho, ale tažšie sa to už naprogramuje.

Prvý problém, ktorý som sa snažil vyriešiť je rekurzia. Keďže Basic nemá lokálne premenné, tak rekurzia je riadna otrava. Možno by sa dali využiť definované funkcie, ale v týchto vodách nie som doma. Takže prvá vec, ktorú treba spraviť, je sa rekurzie zbaviť. To by nemal byť problém, pretože ak budeme generovať body do poľa, tak si vieme vypočítať indexy bodov v poli. Problém je, že myslenie bolí a tento problém znie ako riadna úloha do predmetu Dátové štruktúry a algoritmy.

Preto si to zjednodušíme a budeme body generovať hneď za sebou. Na začiatku teda zapíšeme do poľa naše dve krajné hodnoty. Potom budeme prechádzať pole a medzi každými prvkami si pripravíme nové miesto tak, že zvyšok poľa posunieme o jedno miesto ďalej a do uvoľnenej bunky vypočítame novú hodnotu. Po každej iterácii sa počet bodov zdvojnásobí, takže po ôsmich iteráciách dostaneme 256 hodnôt. Aké ideálne pre rozlíšenie ZX Spectra.

Keďže Basic na presúvanie dát v pamäti nie je stavaný (ak nepoužívame BSROM), tak som sa rozhodol napísať to rovno v assembleri. Generátor náhodných čísiel som si skopíroval z Bazeho Z80 bits a už nič nebránilo v naprogramovaní

vygenerovana krajina

Prvá verzia bola hotová celkom rýchlo, ale občas sa stávalo, že krivka krajiny prešla zo spodnej časti obrazovky na vrchnú. Myslel som si, že na vine bude zlý test prechodu nulou, ale ukázalo sa, že problémom sú čísla so znamienkom. Keďže používam na výpočet 8bitové čísla, tak si treba uvedomiť, že výška krajiny je číslo bez znamienka a prírastok je naopak číslo so znamienkom a preto s tým treba aj počítať pri kódovaní. Tiež som sa trocha zaplietol v inštrukciách rotácií. Nikdy si nepamätám, ktorá inštrukcia je aký posun a bez dokumentácie som stratený.

Po odbugovaní krajinky vyzerajú trošku inak a výsledok, aj so zdrojovým kódom, si môžete pozrieť na http://zeroteam.sk/intros.html. Prajem Vám desiaty krásnych krajiniek!




- 1 = jedna