torstai 30. marraskuuta 2017

Siili, mansikka ja vektori

Ah, vektorit, nuo pitkän matematiikan kauhut ja fyysikkojen lempilelut. Osalle lukiolaisista vektorit tuntuvat hieman vaikeilta, osalle luonnollisimmalta jutulta paahtoleivän ja langattoman netin jälkeen. Henkilökohtainen kokemukseni on, että pelien koodaileminen yläkoulussa siirsi minut vakaasti jälkimmäiseen ryhmään, joten nyt yritän selittää saman näin nettitekstin välityksellä.

Sivumennen sanoen ymmärrän lukiolaisten tuskan. Olen paraikaa kurssilla, jossa suunnilleen kaikki on vektoria... muun muassa funktiot. Kyllä vaan, $f(x) = x + (\sin x)^2$ on vektori jossain ääretönulotteisessa avaruudessa. Tämän sisäistäminen vaatii jo jonkinlaista luottamusta määritelmien voimaan... enkä enää ihmettele, miksi matemaatikkojen ainejärjestö on nimeltään Matrix.

It is not the spoon that bends, it is only yourself.

Mutta eipä harhauduta nyt moisiin ajatuksiin (ne sopivat toiseen kertaan), vaan aloitetaan kysymällä mikä vektori oikein on — ilman yliopistotason selitystä. Aion olla niin radikaali, etten koskaan edes kerro vastausta. Näytän vain esimerkkejä ja sitten leikimme niillä. Aletaanpa väsätä peliä siileistä ja mansikoista.

Pelissämme on maailma, kaksiulotteinen maailma. Ympäri maailmaa on mansikoita ja siilin tehtävä on mutustaa ne suihinsa. (Lisäksi pelissä on sosiaalisia ominaisuuksia ja sovelluksensisäisiä ostoja.) Kun peli alkaa, siili on pisteessä $(0, 0)$ ja mansikka kohdassa $(4, 3)$.

Siilin alkupiste on harvinaisen strategisesti valittu: se on origo, koko maailman keskipiste. Mansikka puolestaan on pisteessä, joka sijaitsee origosta neljä yksikköä itään ja kolme pohjoiseen.

Siili pääsee mansikan luo monella tavalla. Se voi kulkea neljä askelta itään ja sitten kolme pohjoiseen. Se voi kulkea kolme askelta pohjoiseen ja sitten neljä itään. Se voi kulkea jotain vinoa reittiä tai kiertää puun ympäri tai muuten vain pyöriä ympäriinsä kunnes täräyttää päistikkaa mansikkaan.

Tämän jutun opetus on, että vektorien yhteenlasku toimii ihan kuten lukujenkin. Järjestyksellä ei siis ole väliä.

Laitetaanpa pikku siili liikkeelle. Kun pelaaja painaa nuolta ylöspäin, siilin pitää liikkua jonkun verran pohjoiseen. Mutta kuinka paljon?

Peleissä on animaatioista ja leffoista tuttu ruutunopeuden käsite. Tietokone pystyy näyttämään — ja ihminen erottamaan — vain rajallisen määrän ruutuja sekunnissa. Siilipelimme näyttää miljoonabudjetin tuotokselta uusimmille konsoleille, joten se tähdännee 60 ruutuun sekunnissa. Jos söpö siili mönkii kaksi yksikköä sekunnissa, yhtä ruutua varten sen pitää liikkua kuudeskymmenesosa tästä.

Onneksi vektorin kertominen luvulla ei ole kovin vaikeaa:

\[ \frac{1}{60} \cdot (2, 0) = (2 / 60, 0 / 60). \]

Hyvä, nyt siili osaa liikkua pääilmansuuntiin. Mutta entäpä jos pelaajamme painaa yhtä aikaa nuolia ylös ja oikealle? Ensimmäinen painallus liikuttaa siilulia kaksi yksikköä sekunnissa pohjoiseen ja toinen samaa vauhtia itään: jos siili tekee molemmat kerralla, se kiitää koilliseen tavallista suurempaa vauhtia.

Mikä avuksi, jotta siili taapertaisi joka suuntaan samalla vauhdilla? No, jokaiselle vektorille on määritelty pituus. Kuten äsken huomattiin, vektorin kertominen positiivisella luvulla ei muuta sen suuntaa vaan pelkästään pituutta. Jos vektorin kertoo pituudensa käänteisluvulla, sen suunta pysyy samana mutta pituus muuttuu ykköseksi. Koska kaikilla suuntavektoreilla on nyt sama pituus, ne voi huoletta kertoa siilin vauhdilla ja kaikki toimii.

Pieni siilimme osaa nyt seikkailla mansikkaisilla mättäillä. Mutta millonkas siili poimii makean marjan suuhunsa?

Se varmaankin riittää, että siili kahmaisee mansikan tullessaan tarpeeksi lähelle sitä. (Hifistelijä varmistaisi, että siilin etupää on riittävän lähellä.) Tarvitaan siis siilin ja mansikan välinen etäisyys. Tämä saadaan löytämällä siilin ja mansikan välinen vektori — yksinkertainen vähennyslasku riittää — ja laskemalla sen pituus vanhan kunnon Pythagoraan kikalla.

Jos siis mansikka on pisteessä $(4, 3)$ ja siilin sijainti on $(4.5, 2.5)$, näiden erotus on $(-0.5, 0.5)$. Pythagoras sanoo, että etäisyys on nyt $\sqrt{(-0.5)^2+0.5^2} = 1/\sqrt 2 \approx 0.7$. Pelisuunnittelijan tehtäväksi jää päättää, kuinka kauas pelihahmon ahnas nokka ylettää. (Ja kuinka monta timanttia mansikkamagneetti maksaa!)

Nyt meillä siis on monta hienoa pelimekaniikkaa. Ensi kerralla siirrämme makeannälkäisen siilimme kuvaruudulle ja kohtaamme jotain niinkin pelottavaa kuin matriiseja. Se ensi viikolla.

Ei kommentteja:

Lähetä kommentti

Kommentit ovat moderoituja - yritän hyväksyä kommenttisi mahdollisimman pian. Voit kirjoittaa kommenttiin LaTeX-koodia - lue lisää Kommentointi-sivulta.