Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Vektorin muodostaminen aluksen suuntaan

Sivun loppuun

Burton [10.01.2008 17:54:26]

#

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?

TsaTsaTsaa [10.01.2008 18:08:40]

#

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

hunajavohveli [10.01.2008 18:24:02]

#

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.

TsaTsaTsaa [10.01.2008 18:25:35]

#

Totta turiset, enpä tullut ajatelleeksi.

Burton [10.01.2008 19:13:35]

#

Nämä kulmat siis asteina vai radiaaneina kuten ohjelmoinnissa yleensä?

TsaTsaTsaa [10.01.2008 19:23:40]

#

Sehän riippuu siitä, kumpia käyttämäsi kieli ymmärtää trigonometrisissa funktioissa.

Legu [10.01.2008 19:24:53]

#

Radiaaneina C:ssä ja C++:ssa, mutta kerro toki mitä kieltä käytät.

Burton [10.01.2008 19:26:54]

#

Juu, C++ käytössä. C++:ssa olisi kiva vektoriluokka itsessään, mutta ajattelin tehdä hankalammalla tavalla (?). Kiitos vastauksista!

JoinTuanJanohon [10.01.2008 19:56:23]

#

Öö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.

Burton [10.01.2008 19:57:49]

#

Minulle riittää, että itse ymmärrän.

Metabolix [10.01.2008 20:48:50]

#

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.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta