Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Kahden pisteen kulman laskeminen

Sivun loppuun

Sweiz [13.02.2007 09:47:25]

#

Miten saan kahden pisteen välisen kulman selville? Jos siihen on jo funktio jossain kirjastossa, voitteko kertoa? :)

hunajavohveli [13.02.2007 09:55:33]

#

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?

Sweiz [13.02.2007 10:17:33]

#

Hmm, vaikea selittää. Katso kuva, jos se selventäisi asiaa:
http://www.freewebs.com/sweiz/getangle.PNG

DumTom [13.02.2007 10:31:12]

#

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;
}

koo [13.02.2007 15:16:01]

#

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ä.

Jaska [13.02.2007 17:01:42]

#

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ä.

koo [13.02.2007 22:04:09]

#

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.

ZcMander [14.02.2007 21:04:16]

#

Joo, eiköhän se oli niin että kaks pistettä ei muodosta kulmaa, joten kysymys on mahdoton ;)

DumTom [14.02.2007 23:08:56]

#

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.

DumTom [15.02.2007 12:38:38]

#

Kokeilin koon kirjoittamaa funktiota ja toimii yhtä hyvin kuin omanikin on vain lyhyempi ja ehkä hiukan nopeampikin.

Sweiz [20.02.2007 17:13:00]

#

Kiitoksia, atan2 ratkaisi ongelman.

Miten saadaan kahden pisteen välinen etäisyys selville?

Metabolix [20.02.2007 17:30:31]

#

Et osannut sitä hakuun kirjoittaa? Pythagoraan lauseella. Aiheesta kerrotaan matematiikkaoppaassa ja siitä on juuri keskusteltu.

TsaTsaTsaa [20.02.2007 17:32:22]

#

flip92 kirjoitti:

Miten saadaan kahden pisteen välinen etäisyys selville?

Pythagoran lauseella.

r = sqrt( (x2 - x1)^2 + (y2 - y1)^2 )

hunajavohveli [20.02.2007 20:40:10]

#

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ä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta