Iltaa. Pitkästä aikaa joutu vähän miettimään matematiikan perusteita ja eihän siitä mitään tullut. Pää vain jumittaa.
Eli ongelma on, miten saan tietää kumpaan suuntaan ympyrän kehällä pitää liikkua, jotta olisi lyhyin matka tiettyyn kohtaan kehää. Max. arvo on 3.14, jolloin on tapahtunut täysi "pyörähdys". Olemme kehällä kohdassa 0.4 ja tarkoitus olis päästä kohtaan 2.8. Järkihän tuon jo heti kertoo, mutta tarvis tietokoneelle kertoa.
C#:lla tuota ratkon, mutta jos jonkin suuntaa antavan vinkin saisi pseudokielellä, niin voisin sitä vielä yrittää ratkaista hetken päissäni.
Kiitos
Katso kummassa on lyhyempi matka (itseisarvo) a) loppupiste-alkupiste vai b) loppupiste-(alkupiste+Pi).
Ilman itseisarvoa saat sitten vielä suunnatkin.
Tee aluksi helpompi päätelmä, ota jana jonka pituus on x. Laske sitten janalla olevasta pisteestä y, että onko siitä lyhempi matka mennä janan alkuun vaiko loppuun. Sitten kun olet tuon ratkaissut, niin ei pitäisi tuo ympyräkään ylisepääsemätön ongelma olla.
Kiitoksia! Ratkaisuhan oli helppo ja lähellä liikuttiin, mutta joskus tarvitaan se että joku hiukan tönää :)
Kaikissa tilanteissa toimiva ratkaisu on laskea lukujen erotus ja tarvittaessa lisätä tai vähentää 2π, kunnes päästään järkevälle välille ]-π, π]. Siinä vaiheessa etumerkki kertoo suunnan.
def kulma(a, b): k = b - a while k <= math.pi: k += 2 * math.pi while k > math.pi: k -= 2 * math.pi return k print(kulma(0.4, 2.8)) # 2.4 print(kulma(2.8, 0.4)) # -2.4 print(kulma(0.4, 3.6)) # -3.083... print(kulma(0.4, 6.7)) # 0.0168... print(kulma(0.4, 9.9)) # -3.066...
Metaboliksen funktio näyttää prikulleen samalta mitä kirjailin pelimottoriini:
function Angle(srcRadian, destRadian: single): single; begin result:=srcRadian-destRadian; while result<-PI do result:=result+PI*2; while result>PI do result:=result-PI*2; end;
http://code.google.com/p/nxpascal/source/browse/
On kyllä tullut käytettyäkin useammassa projektissa, tarvitsee monenlaisten tekoälyjen ohjelmoinnissa esim.
Varsinaisen ongelman ratkaisin jo edellisillä neuvoilla, mutta pari viimeistä vinkkiä palautti taas muistiini paljon kaikkea kivaa, joten kiitos niistä!
Muutama vuosi sitten, kun leipäni eteen koodasin, olin ihan ok matematiikassa, mutta nykyisin kun suurin haasteeni sillä saralla on soveltaa timpurin suorakulmaa, taidot on päässyt vähän ruostumaan :)
Mutta nyt on taas innostusta ja muutamia ajatuksia, niin todennäköisesti tuun taas kysymään tyhmiä kysymyksiä laskennasta.
Aihe on jo aika vanha, joten et voi enää vastata siihen.