Vesistön suunnittelu

Kun tälle ohjelmalle kertoo saarten muodon ja sijainnin, se näyttää lopputuloksen ja kirjoittaa tuloksen tiedostoon simulointiohjelman ymmärtämään muotoon

Ohjelmointiin kuuluu allaolevan kaltaisia mystisiä määrittelyjä. On melko helppo selvittää, mitä määrittelyjä ohjelma tarvitsee.

Simulointia varten maailma jaetaan kuutioihin. Koska tietokoneeni teho ei riittänyt kolmiulotteisen maailman simulointiin, minulla on kuutioita vain yksi kerros kaksiulotteisessa ruudukossa.

Matematiikassa on tapana esittää pisteen paikka tasossa muodossa (x, y), missä x kertoo vaakasuoran etäisyyden origosta ja y pystysuoran etäisyyden.

Ruudukko, jota simuloinnissa käytän, on järkevä esittää taulukkona, joiden käsittelyyn on käteviä funktiota numpy-moduulissa. Harmi kyllä, taulukossa ruudun paikka ilmoitetaan muodossa taulukko[i, j], missä i ilmoittaa rivin ja j sarakkeen. Yleensä olen tottunut, että i viittaa x-akseliin ja j y-akseliin.

Geometrian kielellä ylläoleva tarkoittanee, että (x,y) tasosta [i,j] taulukkoon siirtyminen on peilaus suoran x=y suhteen. En tiedä, mutta virheitä tuli, kun en heti aluksi miettinyt loppuun saakka, mitä kaikkea tuosta seuraa.

DIM_i ja DIM_j kertovat, montako riviä ja saraketta ruudukossa on. Täydellisessä ohjelmassa saarten sijainti ja mittasuhteet ilmoitetaan niin, että maailma skaalautuu automaattisesti ruutujen määrää muutettaessa. Tämä ei ole ihan täydellinen, muttei huonokaan.

Funktioita saarten piirtämiseen

Piirretään saari

Alla aliohjelma, joka piirtää näytölle saaren sille määriteltyyn paikkaan.

'..add_patch(patch.Ellipse( ...))' näyttää sotkuiselta ja toisinaan onkin työlästä selvittää, millä komennolla saa näytölle haluamansa kuvion.

Piirretään kaikki saaret

Piirretään saaret käyttäen ylläolevaa funktiota. Mystisen näköistä. Onneksi webistä voi copy-pasteta esimerkkejä.

Olennainen tapahtuu riveillä:

    for saari in saaret:
        piirra_saari(kaavio, saari, ds)

Saarten sijainti ja muoto

Saari = (saaren nimi, (keskipisteen x-koordinaatti, keskipisteen y-koordinaatti), ellipsin leveys, ellipsin korkeus, kallistuskulma)

Kerrotaan saarten paikat simulointiohjelmalle

Ellipsin yhtälö

Saaret ovat ellipsejä. Ruudukon ruutu[i, j] on saarella, mikäli i ja j ovat jonkin ellipsin sisällä.

Origossa vaakasuorassa oleva ellipsi

Piste (x, y) on ellipsin kehällä, mikäli allaoleva yhtälö toteutuu. Jos korvaamme =-merkin <-merkillä, saamme epäyhtälön, joka kertoo, onko piste ellipsin sisällä, siis saarella.

Pyöräytetään ellipsiä

Yhtälö ellipsille, jota on pyöräytetty kulman alpha verran.

Luulin pyöräyttymisen kaavan helpoksi johtaa, mutta lopulta jouduin kopiomaan wikipediasta.

Tuntuu, että koordinaatistot (x,y) ja (x_a, y_a) tuli nimettyä harhaanjohtavasti nurinperin. Koska ei haittaa lopputulosta, en jää jahkailemaan.

Siirrytään pois origosta

Kirjoitetaan yleinen ellipsin yhtälö python funktioksi

Tää on vähän sotkuista hommaa. Turha lukea, ellei aio tehdä samaa.

Python koodin tuottamiseen on valmiitakin komentoja, mutta ne eivät tee ihan sitä, mitä tarvitsen.

Valmis koodi alempana.

Valmis koodi