Kerroin aiemmin (”Koodausta palikka kerrallaan”), kuinka aikanaan kaikki näytöllä esitettävä grafiikka koodattiin pikseli kerrallaan. Tässä kirjoituksessa kerron periaatteesta, miten esimerkiksi lumisadetta koodataan.

Yksi tapa kertoa jonkin asian koodaamisesta on käyttää ns. pseudokoodausta. Siinä koodattava asia kuvataan sanallisessa muodossa, mutta ohjelmistomaisesti esitettynä. Pseudokoodauksessa tehdään toteutustapaa tutuksi ja kirjoitetaan ohjelmisto-ongelmaa havainnollisempaan muotoon. Toteutettaja pääsee pidemmälle mietityn asian kääntämään varsinaiseksi ohjelmakoodiksi.

Kuinka siis koodataan lumisadetta?

TOISTETAAN ikuisesti {
     ASETA hiutaleen sijainti yläreunaan (korkeusmuuttujan nollaus)
     ARVO hiutaleen vaakasuuntainen sijainti
     
     TOISTA tätä silmukkaa kunnes hiutale saavuttaa maan pinnan {
          KASVATA korkeusmuuttujaa, jolloin hiutale piirtyy alemmaksi
          ARVO leijumisvaikutus
          PIIRRÄ hiutale valkoisella
          ODOTA
          PIIRRÄ hiutale taustavärillä
     } PALAA silmukan alkuun

} PALAA ohjelmakoodin alkuun

bittimuseo-lumikiteet-miten-koodataan-lumisadetta

Käydäänpä asia läpi toistamiseen

Edellä kerrotaan pseudokoodilla, miten lumisadetta koodataan. Esimerkki todennäköisesti meni ohi, joten käydäänpä vielä sanallisesti uudelleen läpi.

Ensimmäiseksi pikselin korkeus nollataan, jolloin se asemoituu näytön yläreunaan. Vaakasuuntainen sijainti arvotaan. Sen jälkeen toistetaan sellaista toimintaketjua, jossa pikseli piirretään aina edellistä alemmaksi. Pienen hetken jälkeen sama pikseli piirretään taustavärillä, jotta ei muodostu valkoista viivaa. Lumihiutale siis piirretään hetkeksi näkyviin, piilotetaan, ja piirretään alemmaksi.

Jos emme arpoisi hiutaleelle leijumisvaikutusta kuvaavaa sijainnin muutosta, valkoiset hiutaleet piirtyisivät pystysuorasti alaspäin tippuviksi raepisaroiksi. Vaakasuuntaista sijaintia muutetaan satunnaisgeneraattorin avustuksella pikselin tai pari verran vasemmalle tai oikealle, jolloin se tulee alaspäin samalla leijuen.

Lumihiutaleen piirtämisen jälkeen hetken verran on tarpeen odottaa, jotta silmä ehtii havaita hiutaleen piirtymisen. Ilman odotusta hiutale häviää samantien taustaväriin. Samoin hiutale tulisi äärimmäisen nopeasti taivaalta alas, jos ei olisi pientä viivästystä.

Kun hiutale saavuttaa maan pinnan, hiutaleen sijainti nollataan, jolloin se lähtee piirtymään jälleen näytön yläreunasta. Edellä esimerkissä maatasoon piirretty pikseli tulee vielä taustavärillä piilotetuksi, jolloin lienee kyseessä räntäsade maan jäädessä mustaksi. Viimeisin piirto olisi syytä jättää valkoiseksi.

Kun hiutale saapuu maan pinnalle eli ruudun alareunaan, ja jos se vielä jätetään valkoiseksi, niin ruudun alareunassa on hetkisen kuluttua valkoinen lumikerros. Tosin se on vain valkoinen suora viiva. Miten saisimme aikaan hankimuodostelmaa?

Kun hiutale tulee alaspäin, voitaisiin tarkistaa, onko ruudulla jo valkoinen piste ennestään. Jos valkoinen piste löytyy, lumihiutale voitaisiin piirtää juuri pikselin verran ylemmäksi. Tällöin lumikerros kasvaa sen mukaan, miten lumihiutaleet ovat leijuneet ja maahan asettuneet. Oltaisiin jo aidommassa tilanteessa.

bittimuseo-lumikuva-miten-koodataan-lumisadetta

Miten voisimme kehittää algoritmia?

  • Kun hiutaleita on kertynyt useampia päällekkäin, olisi hyvä tarkistaa, pitääkö hiutalekertymää vyöryttää ympärille. Muuten maan pinta muistuttaa ylöspäin osoittavaa kampaa erimittaisine piikkeineen.
  • Yleensä taivaalta sataa lunta sillä tavalla, että useampi hiutale sopii näkökenttään. Sen voisi toteuttaa omaankin lumisateeseen lisäämällä yhtä aikaa piirrettävien hiutaleiden määrää. Ne pitää vain nimetä itsenäisesti, jotta kutakin niistä ohjelmakoodi lennättää oikealla tavalla.
  • Vaakasuuntaista sijaintia voisi ohjata välillä pienellä tuulen vireellä, jolloin kaikki ruudulle piirtyvät hiutaleet liitäisivät hiukkasen enemmän tuulen aiheuttamaan suuntaan.
  • Lumi voisi pikkuhiljaa painua ja värisävykin muuttua hiukan harmahtavan sävyihin, jolloin kertymä erottuisi paremmin.

Keksit varmaan monenlaista kehitettävää. Sovelluksia voi koodata tällä tavalla paperikoodauksena ilman, että tarvitsee vielä hallita ohjelmointikieltäkään. Jos mielenkiinto riittää ohjelmointikielen opiskeluun, niin tässä on mukava alkutalven puuha kokeiltavaksi.

Bittimuseo kyselee, alkaako näytön alapuolelle tippasemaan vettä lumen sulaessa?


Kiitokset kuvista / Thank you for the pictures:


Kiitos kun jaat ystävillesi!