Minulla on vireillä kaksiuloitteinen peli, jossa tarvitsen vektorilaskentaa. Olen vasta lähtökuopissa, mutta ongelmaksi paljastui vektorin muodostaminen haluttuun suuntaan. Jos hahmo siirtyy (ylhäältä kuvattu) johonkin suuntaan, kuinka muodostan "suuntavektorin"?
Mietin, jospa merkitsisin kulman ylös ja sitten laskisin vektorin sen avulla. Jos pelaaja esimerkiksi kulkisi täsmälleen kulmassa 20 astetta (0 astetta täysin oikealle, 270 astetta on ylös, 90 alas ja 180 vasemmalle), niin voitaisiin 0-astevektorin ja 20-astevektorin välinen kulma laskea ja täten temppuilla vaikkapa yksikkövektoriyhtälöillä. Jospa kuitenkin jollain on parempi ehdotus?
Nyt en ole ihan varma ymmärsinkö kysymystä, mutta vastataan silti. Komponentit saa seuraavasti:
y = sin(-kulma)
x = cos(-kulma)
-kulma siksi, kun sinulla on tuossa kiertosuunta myötäpäivään toisin kun yleensä matematiikassa. Niin ja näin saadun vektorin pituus on 1.
EDIT: Jos eri pituisen haluaa, niin
y = sin(-kulma) * haluttu_pituus
x = cos(-kulma) * haluttu_pituus
TsaTsaTsaa kirjoitti:
-kulma siksi, kun sinulla on tuossa kiertosuunta myötäpäivään toisin kun yleensä matematiikassa.
Itse asiassa kiertosuunta on aivan sama, jos oletetaan että y-akselin suunta on näytön ylälaidasta alalaitaa kohti, kuten usein tapaa olla. Matematiikassahan y-akselin suunta piirretään koordinaatistoon usein toisinpäin.
Totta turiset, enpä tullut ajatelleeksi.
Nämä kulmat siis asteina vai radiaaneina kuten ohjelmoinnissa yleensä?
Sehän riippuu siitä, kumpia käyttämäsi kieli ymmärtää trigonometrisissa funktioissa.
Radiaaneina C:ssä ja C++:ssa, mutta kerro toki mitä kieltä käytät.
Juu, C++ käytössä. C++:ssa olisi kiva vektoriluokka itsessään, mutta ajattelin tehdä hankalammalla tavalla (?). Kiitos vastauksista!
Ööh, ei menny oikein jakeluun, mitä oikein haluat.
Oletetaan, että sun äijäs olis ensin pisteessä x1, y1. Ja sitten se äijä siirtyis pisteeseen x2, y2.
Jos nyt halajat, että suuntavektorin itseisarvo on aina jokin vakio, vaikka 1, niin käsittääkseni tarttet vain kulman. Unohra ainakin tan-funktio heti alkuunsa, koska joutuisit sen jälkeen painimaan niiden koulualgebrasta tuttujen sontaoletuksien kaa, että jos x on sitä ja y tuota, niin sitten kulma on sitä, ja jos x on tuota ja y sitä, niin sitten kulma on tämä ja tämä, jne...
Kvaak. Käytä universaalia arc cos lausetta kulman selvittämiseen. Kaavana jokseenkin seuraava:
x = x2-x1
y = y2-y1
r = sqrt(x*x+y*y)
kulma = arc cos(x/r)*signum(y) // C:ssa acos <=> arc cos
Nyt sulla on kulma. Jos sen sun äijäs liikkuu nyt deltan verran pisteestä (x2, y2) pisteeseen (x3, y3), niin sitte tarttee kalkkuureta lause:
x3 = x2 + delta*cos(kulma)
y3 = y2 + delta*sin(kulma)
Ja toi signum palauttaa siis argumentin etumerkin (nolla on +1). Enkä mä ymmärrä, miks tässä ketjussa puhutaan erikseen radiaaneista ja asteista. Ei sillä oo väliä, kun niitä ei vain ristiin käytä.
Joskus asteet ovat helppolukuisempia, varsinkin käyttöliittymäpuolella, mutta toi asteiden veivaaminen radiaaneiksi ja päinvastoin käy taas yhrellä kerto- ja jakolaskulla.
Jos teet 2D:nä, kannattaa aloittaa analyyttisestä tasogeometriasta, ja vääntää ensin vaikka se piste-olio.
Minulle riittää, että itse ymmärrän.
Burton kirjoitti:
C++:ssa olisi kiva vektoriluokka itsessään, mutta ajattelin tehdä hankalammalla tavalla (?).
Se on hieman eri vektori kuin tämä matematiikan vektori.
Kannattaa tehdä pelin matematiikka samaan suuntaan kuin matematiikka yleensä, ettei sotkeudu, minne tulee miinus ja mitä lie muuta. Helpompi on vain piirtovaiheessa korjata asiat kohdalleen. Matematiikassahan X osoittaa yleensä oikealle ja Y ylös ja kulmat mitataan suhteessa X-akseliin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.