Kirjautuminen

Haku

Tehtävät

Keskustelu: Yleinen keskustelu: Lähin reitti ympyrässä

runeberg [12.12.2012 21:16:40]

#

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

Lebe80 [12.12.2012 21:23:48]

#

Katso kummassa on lyhyempi matka (itseisarvo) a) loppupiste-alkupiste vai b) loppupiste-(alkupiste+Pi).

Ilman itseisarvoa saat sitten vielä suunnatkin.

makumaku [12.12.2012 21:24:52]

#

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.

runeberg [12.12.2012 21:35:00]

#

Kiitoksia! Ratkaisuhan oli helppo ja lähellä liikuttiin, mutta joskus tarvitaan se että joku hiukan tönää :)

Metabolix [12.12.2012 21:35:35]

#

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

User137 [13.12.2012 02:03:36]

#

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/trunk/src/nxMath.pas#67

On kyllä tullut käytettyäkin useammassa projektissa, tarvitsee monenlaisten tekoälyjen ohjelmoinnissa esim.

runeberg [13.12.2012 22:00:37]

#

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.

Vastaus

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

Tietoa sivustosta