Winkel zwischen 2 Vektoren wird falsch errechnet.
spacer
Autor Nachricht
Teekeks
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 204
Erhaltene Danke: 22

OpenSUSE 11.4
Lazarus 0.9.31
BeitragVerfasst: Mi 24.08.11 21:42 
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:
ausblenden Quelltext markieren
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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Moderator
Beiträge: 3722
Erhaltene Danke: 133

Arch Linux, Win 7
F#, C# (VS2010)
BeitragVerfasst: 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: .

_________________
>λ=
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Teekeks Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 204
Erhaltene Danke: 22

OpenSUSE 11.4
Lazarus 0.9.31
BeitragVerfasst: 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 :(
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Teekeks Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 204
Erhaltene Danke: 22

OpenSUSE 11.4
Lazarus 0.9.31
BeitragVerfasst: 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 :(
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jfheins
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 332
Erhaltene Danke: 7

Win Vista
VS 2008
BeitragVerfasst: 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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Teekeks Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 204
Erhaltene Danke: 22

OpenSUSE 11.4
Lazarus 0.9.31
BeitragVerfasst: Mi 24.08.11 23:57 
Haa, Jetzt hab ich es hingekommen.

Code:rot=Math.atan2(PointY-Posy,PointX-Posx)*(180/Math.PI);
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home