Tässä esimerkki:
On kaksi ukkelia. Molemmat katsoo satunnaisiin suuntiin, ja toisen täytyisi saada katsomaan toista suoraan kohti.
Eli mitenkä tälle ukkelille voisi laskea sen kulman, missä sen pitää olla ollaakseen toista ukkelia kohti? Kulma asteissa siis...
On kaksi ukkelia. Molemmat katsoo satunnaisiin suuntiin, ja toisen täytyisi saada katsomaan toista suoraan kohti.
Eli mitenkä tälle ukkelille voisi laskea sen kulman, missä sen pitää olla ollaakseen toista ukkelia kohti? Kulma asteissa siis...
Vastaukset 3
Vanhimmat
Etten osaa ihan suoraan sanoa, mutta eiköhän tuo riipu aika paljon niiden sijainnista toisiinsa nähden. Eli toisin sanoen muodostat niiden äijien välille suorakulmaisen kolmion (kateetit ja hypotenuusa). Niiden välinen kulmahan tulee hypotenuusan ja toisen kateetin välisestä kulmasta eli linja on hypotenuusa. Näin ollen toisen kulmaks tulee esim 30astetta ja toisen 210.. tai sit tossa ei oo mitään järkee
Kannattaa katsastaa trigonometrian perusteet vaikkapa yläasteen matikan kirjasta. Muodosta ruudulle kuvitteellinen suorakulmainen kolmio, jossa kateetit ovat ukkelien sijaintien erotukset pysty- ja vaakasuunnassa. Tällöin metsästämäsi kulman tangentti on kulman vastakkaisen kateetin pituus jaettuna viereisen kateetin pituudella, josta saat edelleen kulman sujauttamalla edellisen arctanin läpi. Suosittelen lämpimästi kertaamista. Kaikki käy helpommin, kun ymmärtää, mitä tekee, eikä vaan ota kaavaa valmiiksi annettuna.
Matemaattisesti tämä olisi helppo laskea, kunhan vaan käyttää arkustangettia, mutta kun itse aikanaan koodasin yhtä peliä, en löytänyt hakemiani matikka funktioita (silloisista DOS kirjastoista) enkä muutenkaan tarvinnut tarkkaa kulmaa, vaan pelin käyttöön sinne-päin kulman. Tässä idea speudo-koodina, josta voinet tehdä tarvittavan toteutuksen haluamallesi kielelle.
Luultavasti liikutat äijiä ruudulla jokseenkin seuraavalla tavalla:
x(uusi) = x(vanha) cos(suunta) * vauhti
Ja äijien välisen etäisyyden saat neliöjuurella:
x_erotus = abs(x1 - x2)
x_nelio = x_erotus * x_erotus
y_erotus = abs(y1 - y2)
y_nelio = y_erotus * y_erotus
etaisyys = sqrt( x_nelio y_nelio )
Ja voit hakea suunnan laskemalla kuinka kaukana äijät olisivat toisistaan jos liikuttaisit 1. äijää niiden välisen etäisyyden verran eteenpäin. Ja käyt vaikka kaikki kulmat läpi (haluamallasi tarkkuudella ~5*) ja etsin pienimmän erotuksen eli parhaimman suunnan. Tässä tosin tarkkuus huononee mitä kauempana äijät toisistaan ovat. Ja vastaavasti nopeus huononee mitä pienemmällä kulman muutoksella kokeilua toistaa.
Haku tarkentuu ja nopeutuu kun etsit kulmaa kokeilemalla ensin isoilla käännöksillä kumpaan suuntaa äijän pitää kääntyä ja kun kulma kääntyy taas kauemmaksi, niin puolitat kulman ja lähdet kääntymään takaisin päin. Toistat tämä silmukalla muutamia kertoja niin saat jo peliä varten tarpeeksi tarkan kulman.
Toivottavasti sait tästä jotain irti.