Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Winkel zwischen 2 Vektoren wird falsch errechnet.


Teekeks - Mi 24.08.11 21:42
Titel: Winkel zwischen 2 Vektoren wird falsch errechnet.
Hallo!

Ich habe ein Problem und komme nicht darauf was falsch sein soll.

Ich habe einen Spieler an den Koordinaten (Posx|Posy).
Dann habe ich den Cursor an den Koordinaten (PointX|PointY).

Nun möchte ich den Spieler zum Mauszeiger Rotieren. Dazu gibt es die Flieskommazahl rot vom Spieler, welche eine Angabe der Rotation in Grad sein soll.

Nach oben gedreht beträgt die Rotation ja genau 0°.

Also habe ich mir gedacht dass ich einfach 2 Vektoren Bilde (einen entlang dieser 0°-Linie mit (0|-1) und den anderen zwischen dem Spieler und dem Cursor) und dann einfach den Winkel zwischen den beiden Errechne.

Der entsprechende Java-Code sieht so aus:

Quelltext
1:
    rot=Math.acos(((-1)*(PointY-Posy))/(Math.sqrt(Math.pow(PointX-Posx,2)+Math.pow(PointY-Posy,2))));                    


Jedoch bekomme ich leider nicht das gewünschte Ergebnis. (rot ist 1.5 an Stellen wo es 45.0 sein sollte usw.).
Also muss ich ja was falsch gemacht haben.

Könnt ihr vl. den Fehler finden?

Gruß Teekeks


Kha - Mi 24.08.11 21:51

Acos allein reicht wegen seines Wertebereichs von [0,pi] nicht aus, nimm Atan2. Vielleicht noch Grad und Radians verwechselt?
Finde es auch merkwürdig, dass du 0° oben ansetzt, das beißt sich doch mit allen trigonometrischen Funktionen :gruebel: .


Teekeks - Mi 24.08.11 22:10

Die Graphik ist hat so rotiert.
Kann ich aber auch noch ändern wenn das günstiger sein sollte.

Aber atan2 benötigt 2 Parameter.
Wie muss ich die Nutzen? Aus der Englischen Hilfe bin ich nicht schlau geworden :(


Teekeks - Mi 24.08.11 23:02

Ahh, Wenn ich das jetzt richtig verstanden habe, müsste ich nur die 2 Koordinaten (PointX und PointY) angeben um den Winkel zwischen dem und der X-Achse zurück zu bekommen.

Jedoch gibt es da ja 2 Probleme: a) Auf welchen Punkt bezieht der sich dabei? und b) wenn ich das so mache wie ich mir das vorgestellt habe, (einfach nur die 2 Koordinaten angeben) bekomme ich nur Werte um die 0.irgendwas raus (muss ich das vl noch umrechnen?)

Edit: oh, sry. Doppelpost :(


jfheins - Mi 24.08.11 23:51

Die Funktion ist dazu gedacht, zu einem Koordinatenpaar den richtigen Winkel für Polarkoordinaten zurückzuliefern.

Wenn du nun bei den beiden Parametern deinen Vektor Spieler/Cursor einsetzt, bekommst du den Winkel des Vektors im mathematischen koordinatensystem. Den Winkel dann in dein KoSys umzurechnen überlasse ich erstmal dir.


Teekeks - Mi 24.08.11 23:57

Haa, Jetzt hab ich es hingekommen.

Code:rot=Math.atan2(PointY-Posy,PointX-Posx)*(180/Math.PI);