Miten saan kahden pisteen välisen kulman selville? Jos siihen on jo funktio jossain kirjastossa, voitteko kertoa? :)
Tarkennatko kysymystä? Kahden pisteen välillä ei ole kulmaa, tarkoitit varmaan kahta suoraa tai janaa? Tai näiden kahteen pisteen välisen suoran ja x/y-akselin välistä kulmaa?
Hmm, vaikea selittää. Katso kuva, jos se selventäisi asiaa:
http://www.freewebs.com/sweiz/getangle.PNG
Kokeiles tota,ainakin mun dospeleissä toimii.
PI pitää tietty definoida piin likimäärällä.
float Angle(float kx1, float ky1, float kx2, float ky2) { float kulma; if (kx1==kx2 && ky2>ky1) kulma=PI/2; if (kx1==kx2 && ky2<ky1) kulma=3*PI/2; if (kx1!=kx2) kulma=atan((ky2-ky1)/(kx2-kx1)); if (kx2<kx1) kulma=kulma+PI; return kulma; }
Mikä ts. kumpiko se noista kulmista pitikään selvittää?
Onko tulokselle jokin tietty arvoalue?
Menisikö kuitenkin näin?
float angle(point const &p1, point const &p2) { return std::atan2(p2.y()-p1.y(), p2.x()-p1.x()); }
Tulokseen pitää suhtautua sitten samoin varauksin kuin liukulukulaskennan tuloksiin yleensäkin. Luulen kuitenkin, että atan2
on parempi kuin atan
tässä, sillä matikkakirjaston tekijä tekee aikas varmasti parametrien tarkastukset paremmin kuin kukaan meistä.
koo kirjoitti:
sillä matikkakirjaston tekijä tekee aikas varmasti parametrien tarkastukset paremmin kuin kukaan meistä.
Todellako? Itse oletan, että arkustangentti x:stä lasketaan päähaarasta. Tarkistettavaksi jää ehto -1<=x<=1, jos lasku tehdään arkustangentin sarjakehitelmästä
arctan x=x-x^3/3+x^5/5-x^7/7+...+(-1)^nx^(2n+1)/(2n+1),
Virhetermin suuruutta voi helposti arvioida niin tarkasti kuin huvittaa. Numeerisen laskennan opettelussa ei tarvitse mennä kovinkaan syvälle, kun osaa jo laskea analyyttisille funktioille sarjakehitelmiä, määrittää niiden suppenemissäteitä ja arvioida virhettä.
Jaska kirjoitti:
Numeerisen laskennan opettelussa ei tarvitse mennä kovinkaan syvälle, kun osaa jo laskea analyyttisille funktioille sarjakehitelmiä, määrittää niiden suppenemissäteitä ja arvioida virhettä.
Eikös se ole joku sanonta, että vaarallisimpia ovat ihmiset, jotka tietävät vähän? Tietämättömät eivät tee mitään, tietäväiset tekevät kunnolla ja lopuille kaikki on vaan niin helppoa! :-)
Kirjastofunktioita ei edes tarvi, jos osaa toteuttaa laskennan ja sen vaatiman virheanalyysin ja -käsittelyn itse. Vaatii kyllä tosi paljon työtä, että se on sitten varmasti oikein. Vaikka tuntee sarjakehitelmät ja sen virhetermit, esmes osatermien laskujärjestyksen valinta numeerisesti ja algoritmisesti oikealla tavalla on vielä eri juttu. Ketjumurtolukuihin perustuva laskentakaava saattaisi muutenkin olla parempi tapa laskea arctan kuin tuo peruskaava, mutta enpä ryhdy arvailemaan. Joka tapauksessa, ei ehkä kannata väsätä sellaista, joka jo on kirjastossa.
Jos käyttää kirjastoa, pitänee valita atan
tai atan2
. Ekassa vaihtoehdossa järkevää itse tarkistella, että parametriksi aiottu osamäärä on laskennan kannalta kelvollinen. On vähän arvailujen varassa, miten funktio milloinkin todella lasketaan - kuuluuko sitä niin tietääkään - joten virhemarginaaliarvailujen ja lukualueiden kelvollisuuksien toteuttaminen ei taida sittenkään olla niin helppoa. Pelkkä liukulukujen vertailu p2.x() == p1.x()
ei oikein vakuuta. Koska atan2
:lle annetaan erikseen osoittaja ja nimittäjä, kirjaston tekijä on saman ongelman edessä kuin me muut atan
:in kanssa, mutta jotenkin vain luotan tuohon hemmoon enemmän kuin esmes itseeni.
Joo, eiköhän se oli niin että kaks pistettä ei muodosta kulmaa, joten kysymys on mahdoton ;)
Eiköhän asiaa pitäisi ajatella niin että on matkattava pisteestä A pisteeseen B.
Tai toisinpäin,matka pisteestä B pisteeseen A.
Eli missä kulmassa(0-359astetta) liikkuva esine siirtyy eteenpäin.
Kokeilin koon kirjoittamaa funktiota ja toimii yhtä hyvin kuin omanikin on vain lyhyempi ja ehkä hiukan nopeampikin.
Kiitoksia, atan2 ratkaisi ongelman.
Miten saadaan kahden pisteen välinen etäisyys selville?
Et osannut sitä hakuun kirjoittaa? Pythagoraan lauseella. Aiheesta kerrotaan matematiikkaoppaassa ja siitä on juuri keskusteltu.
flip92 kirjoitti:
Miten saadaan kahden pisteen välinen etäisyys selville?
Pythagoran lauseella.
r = sqrt( (x2 - x1)^2 + (y2 - y1)^2 )
DumTom kirjoitti:
Eiköhän asiaa pitäisi ajatella niin että on matkattava pisteestä A pisteeseen B.
Tai toisinpäin,matka pisteestä B pisteeseen A.
Eli missä kulmassa(0-359astetta) liikkuva esine siirtyy eteenpäin.
Mutta se kulma ei edelleenkään ole pisteiden välillä, vaan pisteiden kautta kulkevan suoran ja x-akselin välillä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.