Olen tässä c++:an peliohjelmointiin liittyviä juttuja katsastellut ja usein (ellei lähes aina) on esim. ammuksen lentoradan laskentaan käytetty Sin:iä ja Cos:ia. Minulle ei alaastelaisena vielä olla noita opetettu ja heräsi kiinnostus: mitä ne oikein ovat? Mihin ja miten niitä käytetään? Mites palautusarvot?? Olisi kiva jos antaisitte vielä jonkin (vaikka vain teoreettisen) esimerkin niiden käytöstä. :)
Sini, kosini ja tangentti ovat trigonometrisia funktioita jotka liittyvät ensisijaisesti suorakulmaisiin kolmioihin. Esimerkiksi jokaisessa suorakulmaisessa kolmiossa kulman, jonka suuruus on x, vastaisen sivun pituus jaettuna kolmion hypotenuusan pituudella on aina vakio, jonka suuruus on sin(x).
Esimerkki:
Suorakulmaisen kolmion eräs kulma on 45 astetta ja hypotenuusan (eli pisimmän sivun) pituus 4m. Nyt voidaan laskea sinillä kulmaa vastassa olevan sivun pituus seuraavasti (olkoon sen pituus a):
sin(45) = a / 4m
kerrotaan yhtälön molemmat puolet 4m:llä
sin (45) * 4m = a
kun sin (45) * 4 näpytellään laskimeen, saadaan vastaus:
Noin 2,828m
Voi kyllä olla ala-astelaiselle vähän hankalaa kun yhtälöt eivät ole tuttuja... Jos et ymmärrä niin kysy niin yritän selittää vähän tarkemmin.
Peruskoulun selitykset sinille ja kosinille: http://213.138.144.231/lauri/ylaaste/lumasivu/
Ja jotta saisit niillä enemmän aikaan, tutustu yksikköympyrään sivun alusta: http://matwww.ee.tut.fi/jkkm/trigonom/trigo03.
Ideana on siis se, että saadaan laskettua liikemäärä X- ja Y-akseleilla, kun tiedetään kulkusuunta kulmana.
Yhdeksännen luokan asioita. Selostaisin kyllä perinpohjin, jos vain viitsisin, mutta ei, tyydyn vain pasteamaan linkin wikipediaan: http://fi.wikipedia.org/wiki/Trigonometria
Eli suorakulmaisen kolmion sivujen suhteita nuo ovat.
EDIT: Harvinaisen hidas.
Tuota on kyllä vähän vaikea sisäistää... Harmittavaa että alaasteen luokanopettaja on yleisopettaja eikä osaa asiaa paljon pitemmälle kuin oppilaille on opetettava eikä minua siten osata koulussa auttaa. Uskoisin että ensivuonna yläasteella (Pääsin tietotekniikka painotteiselle luokalle!) minua osataan auttaa.
Kiitos molemmille avusta! :)
EDIT:
Juice: ok. Mikä on harvinaisen hidas?
Juice on harvinaisen hidas :)
No mutta on kyllä trigonometriakin, kun vertaa kertolaskuun ja jakolaskuun.
Wikipedian mielestä trigonometria on ilmeisesti niin helppoa, että sen voi esitellä ilman yhtään kuvaa. Jopa MathWorldissa asia oli esitetty selkeämmin.
Trigonometrian sisäistämistä helpottanee leikkiminen aiheeseen liittyvällä Java-apletilla: http://catcode.com/trig/trig11.html
Mielestäni hyvä tapa havainnollistaa trigonometrian merkitystä peliohjelmoijalle on seuraava käytännön esimerkki: Jos ukko liikkuu nopeudella v
pikseliä framella suuntaan A
, niin ukon x- ja y-koordinaatteja muutetaan seuraavasti:
x += v * cos(A); y += v * sin(A);
Tätä ennen täytyy kuitenkin selviytyä radiaaneista...
os kirjoitti:
Tätä ennen täytyy kuitenkin selviytyä radiaaneista...
Ja ennen kuin kysyt, selitän vähän perusteita radiaaneista.
Olet varmaankin käsitellyt kulman suuruuksia asteina (suora kulma on 90 astetta, oikokulma 180 astetta jne). Radiaaneissa taas oikokulman suuruus on pii ja suorakulman pii/2. Radiaani määritellään tarkasti siten, että jos koordinaatistoon piirretään ympyrä, jonka säde on 1, ja ympyrään piirretään sektori jonka keskuskulma on x radiaania, vastaavan kaaren pituus on sama x. Kuva: http://my.linuxshell.cc/~heikki/radiaani.png
Toinen kuva huonolla webbikameralla maolin taulukkokirjasta: http://my.linuxshell.cc/~heikki/maol_radiaani.
Muunnoksissa voidaan käyttää koodeja:
// Deg tarkoittaa asteita, Rad radiaaneita. double pi = 3.14159265; // Asteet radiaaneiksi double DegToRad(double deg) { return (deg/180.0) * pi; } // Radiaanit asteiksi double RadToDeg(double rad) { return (rad/pi) * 180.0; }
Mutta tämä on jo lukion pitkän matikan asioita...
Asiaa voi ajatella myös ympyrän piirtämisenä:
x = kx + r * cos(a)
y = ky + r * sin(a)
Tässä (kx, ky) on ympyrän keskuspiste, r on ympyrän säde ja a on kulma, johon piste piirretään. Eri kulmiin piirretyistä pisteistä muodostuu ympyrä. Kaikki pisteet ovat saman etäisyyden (r) päässä ympyrän keskipisteestä.
Samalla saadaan vastaus kysymykseen: kun tiedetään liikkumissuunta ja liikuttava matka, kuinka paljon liikutaan vaakasuunnassa (x-akseli) ja pystysuunnassa (y-akseli)?
Aste ja radiaani ovat kulman yksiköitä. Asteissa mitattu kulma on suuruudeltaan 0 - 360 astetta. Radiaanien asteikko on 0 - 2 * pii astetta. Radiaanit ja asteet kasvavat samassa suhteessa, eli esim. 180 astetta on pii radiaania. Muunnoskaava on aste / 180 * pii = radiaani. Ohjelmointikielissä käytetään melkein aina radiaaneja.
Yläasteella trigonometriaan tutustutaan suorakulmaisen kolmion avulla, ja ohjelmoinnissa tärkeät asiat jäävät silloin peittoon. Lukiossa tulee yksikköympyrä, joka on minusta havainnollinen ja kytkeytyy suoraan ohjelmointiin.
Tämä aihe olisi mielestäni oppaan arvoinen.
os kirjoitti:
Wikipedian mielestä trigonometria on ilmeisesti niin helppoa, että sen voi esitellä ilman yhtään kuvaa. Jopa MathWorldissa asia oli esitetty selkeämmin.
Taidat puhua suomenkielisestä Wikipediasta, joka onkin mielestäni aika turhake.
Mielestäni erittäin kätevä kuva sieltä englanninkieliseltä puolelta löytyy tällaisen osoitteen takaa: http://en.wikipedia.org/wiki/Image:Circle-trig6.png
Deewiant kirjoitti:
Taidat puhua suomenkielisestä Wikipediasta, joka onkin mielestäni aika turhake.
Englanninkielisessä Wikipediassa täytyi näköjään osua Trigonometric Function -sivulle Trigonometry-sivun sijaan. Onhan tuo sivu toki aika kattava, mutta kärsii vähän samasta viasta kuin MathWorld: Jos ei asiaa etukäteen osaa, ei sivun korkealentoisesta sisällöstä paljoa hyötyä irtoa.
Lähes kaikki mitä täällä minulle kerrotaan on aivan umpiuutta mutta alan pikkuhiljaa hahmottamaan asiaa. :)
Perinpohjaisesti trigonometrian käsittelevä opas tulisi kyllä tarpeeseen! Siinä voisi myös olla erillinen osuus joka käsittelee trigonometriaa peliohjelmoinnissa niille jotka jo ovat koulussa sitä opiskelleet. :)
os kirjoitti:
Englanninkielisessä Wikipediassa täytyi näköjään osua Trigonometric Function -sivulle Trigonometry-sivun sijaan. Onhan tuo sivu toki aika kattava, mutta kärsii vähän samasta viasta kuin MathWorld: Jos ei asiaa etukäteen osaa, ei sivun korkealentoisesta sisällöstä paljoa hyötyä irtoa.
Nojaa. Kyllä tuo minun mielestäni suhteellisen selkeää tekstiä on, kunhan tajuaa omat rajansa - ei esim. ala-astelaisen kannata välttämättä välittää mm. funktioiden nollakohtien määrittelyistä tai funktioiden määrittelyistä Maclaurinin sarjojen avulla. Tuolta Wikipedian sivulta ei kannata lukea, ellei ole oikeasti matematiikasta kiinnostunut, alun lisäksi muuta kuin osiot Right triangle definitions sekä mahdollisesti Unit-circle definitions. Ohjelmoijaa saattaa lisäksi kiinnostaa Computation-otsikon alta löytyvä tieto. "Yli menevien" kohtien kuten aivan alun yleispuhelun loputtomista sarjoista ja differentiaaliyhtälöistä tai joidenkin mainintojen Euclidean planesta (sori, en osaa kaikkia matikan termejä suomeksi) ylitse voi helposti, ja ehkä kannattaakin, hypätä.
Samalla tavalla voi mielestäni lukea myös esimerkiksi Mathworldin kertomusta sinifunktiosta: jätän kernaasti tarkastelematta ainakin kohtia 8, 11-18, 23-24 sekä 26-27 tarkemmin, koska en tunne tarvittavia asioita niiden ymmärtämiseksi enkä ainakaan tällä hetkellä viitsi ottaa kyseisistä asioista selvää. Kohta 25 sivulta oli kuitenkin minulle uusi tuttavuus, joka on hyvä pistää muistiin vaikka ohjelmointikäyttöä varten.
zorm kirjoitti:
Perinpohjaisesti trigonometrian käsittelevä opas tulisi kyllä tarpeeseen!
Kun nyt asia tuli puheeksi, olen ajatellut kirjoittaa vähän laajemmankin oppaan, joka on suunnattu erityisesti ala-asteen ja yläasteen oppilaille. Trigonometria ei ole ainoa ohjelmoinnissa tarvittava matematiikan alue, joka tulee koulussa nuoren ohjelmoijan kannalta harmittavan myöhään.
Tuo on on todella hyvä idea! Äitini ehdotti lainaamaan kirjastosta jonkin oppikirjan mutta nehän ovat tietenkin tarkoitettu paljon vanhemmille.
Mitä muita ohjelmoinnissa tarvittavia matematiikan alueita on olemassa?
Riippuu siitä, mitä ohjelmoi. Jokseenkin koko lukion oppimäärää voi hyödyntää, eikä sekään riitä paljon minnekään, jos aivan oikeasti alkaa peliä tehdä. Fysiikka on se toinen tarvittava, ja juuri siihen matematiikkaakin tarvitaan.
Varsinkin sekalaisissa graafisissa sovelluksissa voi minkä tahansa matematiikan osa-alueen ympärille kyhätä jonkinlaisen ohjelman. Jos matematiikkaa haluaa kuitenkin käsitellä työvälineenä, eikä itseisarvona, pärjää hyvin tiettyjen asioiden hallinnalla. Nämä matematiikan alueet myös nivoutuvat lopulta toisiinsa muodostaen ohjelmoijan kannalta eheän kokonaisuuden. Toisaalta taas sovellettavaa löytyy välillä yllättäviltäkin alueilta, ja hyvän kokonaiskuvan saamiseksi voi joutua opiskelemaan varsin paljon.
Esimerkiksi peliohjelmoijan kannalta tärkeintä on geometria ja kaikki siihen liittyvä; mitä enemmän osaa sitä "kehittyneempiä" juttuja saa aikaiseksi. Kannattaa hallita ainakin:
1. Trigonometria, nimenomaan yksikköympyränäkökulmasta
2. Vektorilaskenta, josta on hyötyä lähes kaikkialla
Erityisen suosittuja ovat myös:
3. Muunnosmatriisit ja kvaterniot, "3D-fysiikan" mallinnokseen
Sekalaista sovellettavaa ja sisäistettävää löytyy erityisesti numeriikasta, differentiaalilaskennasta, lineaarialgebrasta, kompleksiluvuista, ja muuhun kuin peliohjelmointiin tietysti verkkoteoriasta ja algoritmiikasta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.