Tarvitsisin ratkaisun seuraavan ongelmaan:
2D -Koordinaatistossa on piste A, jonka yläpuolella on piste B (B.Y = A.Y - 1). Mikä on pisteen A,B ja satunnaisen pisteen C muodostama NEGATIIVINEN kulma, eli kulman kiertosuunta on myötäpäivään?
Esimerkkikuva selventäisi kysymystäsi. Mikä piste on A,B?
Jos nyt ymmärsin ongelman oikein, niin haluat viivan, joka kulkee pisteestä A pisteeseen B ja viivan, joka kulkee pisteestä A pisteeseen C välisen kulman, vai mitä?
Voisit selittää lisäksi mikä kulma?
Juu, eihän kaksi pistettä muodosta kulmaa vaan tarvitaan kolmaskin piste. Jos tiedät nämä kolme pistettä saa tuloksen helposti vektoreiden pistetulon avulla.
Siis niin kuin dOb sen käsitti, eli piste A on kulman kärkipiste. Tarkoitin piste A,B:llä piste A:ta ja piste B:tä.
No sittenhän tämän saa ratkaistua atan2:n avulla, mutta koska tuotahan ei jokapaikassa ole käytettävissä(?), en tiedä miten tämän voi ratkaista ilman sitä (eli en tiedä mikä atan2:n kaava on).
Tässä on jonkinmoista koodia, josta (luultavasti) selviää millä tyylillä olen ratkaissut tämän. Tämä tuskin on optimaalisin ratkaisu, koska en tosiaan ole kovin pro näissä asioissa ;) (neuvoja otetaan vastaan! :)).
// pisteet Vector a, b, c a.x = 0 a.y = 0 b.x = a.x b.y = a.y - 1 // joku satunnainen paikka tälle siis c.x = 3 c.y = 2 // vektori, joka osoittaa a:sta b:hen Vector d = b - a // vektori, joka osoittaa a:sta c:hen Vector e = c - a kulma = atan2(e.x * d.x - e.y * d.y, e.x * d.x + e.y * d.y) // laitetaan kulma oikealle välille, eli 0...2pi if kulma < 0 kulma = kulma + 2 * pi
Ja siinä on kulma radiaaneina (toivottavasti ;S).
Eikös se ole ihan arkustangentti vastaisen ja viereisen kateetin osamäärästä?
Blaze kirjoitti:
Eikös se ole ihan arkustangentti vastaisen ja viereisen kateetin osamäärästä?
Mutta kun kulma on väliltä 1..360, joten on mahdollista, että viereinen kateetti on nolla, jolloin tulee jako nollalla. Tietysti tämän voi korjata.
Kokeilin huvikseen atan2:sta ja se ratkaisi ongelman. Mikä se muuten on?
Eikö se ole muuten kuin perus-atan, mutta ottaa huomioon myös etumerkit, jolloin saadaan käyttöön koko 0-360 -alue? Tai näin minä ainakin olen käsittänyt. En ole itse käyttänyt kuitenkaan koskaan.
Aihe on jo aika vanha, joten et voi enää vastata siihen.