[im prinzip: winkel eines dreiecks berechnen]
-
Stimmt da was mit acos() bzw asin() nicht?
Ich habe ein Sprite, dass ich immer in richtung des Mauszeigers schauen lassen will.
Im code kann man den sprite ganz einfach so rotieren:
Sprite a; //Sprite laden etc a.SetRotation(90.0f); //Nimmt Grad an
Jetzt dachte ich es so, zwischen Sprite und Mauszeiger lässt sich ein rechtwinkliges Dreieck aufbauen.
Die Länge Seite a wird dabei so berechnet:
Mauszeiger.y - Sprite.y;Die Seite b dann so.
Mauszeiger.x - Sprite.x;
Somit kann ich natürlich auch die Hypothenuse berechnen:
float c = sqrt(pow(a,2)+pow(b,2));
Bis jetzt alles richtig, oder?
Um den Winkel zwischen c und a zu bekommen müsste ich eigentlich nur die acos funktion auf den sinus des winkels anwenden, richtig?
also so
float sinus = sin(c/b); //Gegenkathete/Hyp float winkel = asin(sin); winkel = RADtoDEG(winkel); //sin nimmt ja nur radianten an
Jedoch ist hierbei "winkel" am ende immer ziemilch klein (zwischen 0 und 1.5 glaub ich), anstatt wirklich der winkel zu sein der er sein sollte.
wo hängt es hier?
-
auch auf die gefahr hin, dass ich dich nicht ganz verstanden hab oder nen denkfehler habe:
c => hypothenuse
a => differenz auf der x-achse, sprich horizontale
b => differenz auf der y-achse, sprich vertikale
stimmt das so?wenn ja, dann ist c/b hypothenuse/gegenkathete, nicht gegenkathete/hypothenuse.
// edit:
hoffe das stimmt so:alpha: gesuchter winkel.
sin( alpha ) = b/c
asin( sin( alpha ) ) = alpha
=> asin( b/c ) = alphamfg,
julian
-
Das Problem ist, dass dein Dreieck vierschenklig ist.
-
Julian__ schrieb:
auch auf die gefahr hin, dass ich dich nicht ganz verstanden hab oder nen denkfehler habe:
c => hypothenuse
a => differenz auf der x-achse, sprich horizontale
b => differenz auf der y-achse, sprich vertikale
stimmt das so?wenn ja, dann ist c/b hypothenuse/gegenkathete, nicht gegenkathete/hypothenuse.
// edit:
hoffe das stimmt so:alpha: gesuchter winkel.
sin( alpha ) = b/c
asin( sin( alpha ) ) = alpha
=> asin( b/c ) = alphamfg,
juliannein, hab mich nur verschrieben, ist natürlich b/c.
asin( sin( alpha ) ) = alpha
ja das ist richtig... also müsste ja
sin(alpha) == sin(b/c)und somit auch alpha = asin(sin(b/c)) sein, richtig?
das bringt bei mir jedoch nicht alpha raus, sondern wie erwähnt diesen komischen wert.
@ euler,
wie, 4 schenklig?
-
mathenoob schrieb:
Jedoch ist hierbei "winkel" am ende immer ziemilch klein (zwischen 0 und 1.5 glaub ich), anstatt wirklich der winkel zu sein der er sein sollte.
wo hängt es hier?
vielleicht ist der ist das resultat in Rad. versuch mal *180.f/PI
-
b/c = sin( alpha )
gegenkathete/hypothenuse bzw. b/c ist gleich (!) sinus von alpha.
also ist sin( b/c ) = sin( sin( alpha ) )mfg,
julian
-
Julian__ schrieb:
b/c = sin( alpha )
gegenkathete/hypothenuse bzw. b/c ist gleich (!) sinus von alpha.
also ist sin( b/c ) = sin( sin( alpha ) )mfg,
julianirgendwie blick ich da nciht durch.
rapso schrieb:
mathenoob schrieb:
Jedoch ist hierbei "winkel" am ende immer ziemilch klein (zwischen 0 und 1.5 glaub ich), anstatt wirklich der winkel zu sein der er sein sollte.
wo hängt es hier?
vielleicht ist der ist das resultat in Rad. versuch mal *180.f/PI
ja, stimmt, aber konvertiert nach DEG kommt bei diesem beispiel irgendwas mit 8.*** raus:
std::cout<<RADtoDEG(asin(sin(DEGtoRAD(90.0f))));
-
oh sorry, bei meiner RADtoDEG funktion ist mir wohl ein fehler unterlaufen, ist jetzt korrigiert.
folgendes biespiel:
std::cout<<(asin(sin(DEGtoRAD(90.0)))) * (180.0 / 3.14159265);
bringt etwa 79.**** als ergebnis.
woher kommt die ungenauigkeit? (wird mit doubles gerechnet)
-
nur um noch sicherzugehen:
#define rel_dtor 0.159155 double DEGtoRAD(const double value) { return value * rel_dtor; }; double RADtoDEG(const double value) { return value * (180.0 / PI); };
rel_dtor ist einfach die relation von degree to radiant. (57.nochirgendwas/360 ist 0.159155)