Za jídlo, šaty a vzduch otročíme na programech z temných světů

Programujeme v BASICu: Seriózní programy (3 a ½)

V případě dnešních několika řádků BASICu je titulek trochu zavádějící, není na nich totiž vůbec nic seriózního. Abych tento klam poněkud zjemnil, označil jsem díl alespoň jako poloviční.

V rámci svého každodenního technomorousování jsem si jednoho krásného večera v HiSoft BASICu na Atari ST (respektive v emulátoru hatari) napsal zobrazovač výškové mapy, použité v minulém díle seriózního programování. Během několika následujících dnů projevili zájem o zdrojový kód hned dva lidé, takže tady je:
10 let xshift=256: let yshift=192 
20 open "I", #1, "c:\heightmp.bin"
30 for y=0 to 127  step 1
40 for x=254 to 0 step -2
50 v$=input$ (1, #1)
60 v=asc(v$)
70 color 3, 4, v/10 
80 linef x+xshift, yshift+y+(x/4), x+xshift, yshift+y-v+(x/4) 
90 linef x-1+xshift, yshift+y+(x/4), x-1+xshift, yshift+y-v+(x/4)
100 next x
110 xshift=xshift-1
120 next y
130 close #1
Vykreslený výsledek pak vypadá takto:
3D výšková mapa na Atari
Jak jsem už psal v původním příspěvku, díra v pravém vzdálenějším rohu je povrchový důl v polské Bogatyni, levý vzdálenější roh obsahuje Jizerské hory – nejvyšší, světle modrý vrchol je Smrk, okolo jsou vrcholy nižší. Červená špička blíže k přednímu pravému rohu je Ještěd, mezi ním a Jizerkama je v ďolíku Liberec. Proti realitě je tedy tato pseudo-3D mapa zrcadlově převrácená podle severojižní osy. Kdybych ji nepřevrátil, zakryl by Smrk a celé Jizerky prakticky celý zbytek terénu, protože ten má podstatně nižší nadmořskou výšku.

Perspektiva je dána zdvojením pixelů na ose X a také tím, jak se vůči sobě posouvají jednotlivé řádky a sloupce při každé iteraci vnitřního i vnějšího cyklu a tím, Posun na ose X zajišťuje řádek 110, posun na ose Y a dvojité vykreslení na ose X je na řádcích 80 a 90. Věřím, že zdroják je samovysvětlující.

Vzhledem k velikosti obrázku je třeba Atari schopné kreslit obraz v rozlišení 640×480 s 256 barvami, takže asi TT či Falcon. Předělání pro Low-Res mód běžného ST(E) by vyžadovalo úpravu prakticky všech rozměrů – vynásobení výšky na řádku 60 konstantou 0.7 či nižší, změnu posunů na řádku 10, zrušení zdvojování pixelů na ose X atd., ponechám to na iniciativě laskavého čtenáře.