Rotation bestimmen (double)
-
Hallo,
Ich versuche mich gerade an einem 2D game (mittels SDL
).
Jedenfalls hab ich folgendes (mathematisches?) Problem:Eine Spielfigur hat in meinem game eine eigene positiom (das dürfte selbstverständlich sein). Nun möchte ich diese Figur zu einem Punkt begeben.
(Rotation und bewegung wie links, rechts geradeaus und rückwerts mit berücksichtigung der Rotation hab ich schon implementiert)
An dieser Stelle brauche ich eure Hilfe. Wie kann ich aus der Position (die position wird in zwei ints gespeichert) der Spielfigur und des Punkts (zu dem es bewegt werden soll) die Rotation (double) bestimmen?
=> Ich benötige nur die Rechnung.
int xpos , ypos; // aktuelle Position int goto_x , goto_y; // Position, zu der die Figur bewegt werden soll double angle; // die RotationWie bereits gesagt, brauche ich die Rotation. Könnte mir jemand die Rechnung zeigen.(für Radianten UND) Grad)
Danke im voraus.
-
Nicht nur dir geht strummelbunzi GEWALTIG aufn Sack (sei es seine gespielt naive Art, seine bewusst abartige Rechtschreibung oder seine Kindersmilies). Aber offensichtlich ist eine solche Art von Troll hier im Forum erlaubt...
Zum Problem:
Aus den 2 Punkten kannst du dir ein Dreieck bauen, von dem du alle 3 Seiten (Hypothenuse und Katheten) kennst. Aus dem Sinus/Cosinus etc. kannst du dir dann den Winkel für die Rotation berechnen.
-
interpreter schrieb:
Nicht nur dir geht strummelbunzi GEWALTIG aufn Sack (sei es seine gespielt naive Art, seine bewusst abartige Rechtschreibung oder seine Kindersmilies). Aber offensichtlich ist eine solche Art von Troll hier im Forum erlaubt...
Zum Problem:
Aus den 2 Punkten kannst du dir ein Dreieck bauen, von dem du alle 3 Seiten (Hypothenuse und Katheten) kennst. Aus dem Sinus/Cosinus etc. kannst du dir dann den Winkel für die Rotation berechnen.Danke erstmal. Könntest du bitte ein kurzes Beispiele machen? Meine Kenntnisse in Sachen "Satz des Pythagoras" sind etwas eingerostet. Genauer gesagt sind meine Mathekenntnisse allgemein recht begrenzt.
Wie konstruiere ich aus 2 Punkten einen Dreieck? Verbindet die Hypothenuse die beiden Punkte? Wie geagt: Meine Mathekenntnisse sind arg begrenzt. Für ein kurzes code beispiel wäre ich sehr dankbar.
-
Hoi,
Ich würde es nichtmals mit dem Satz des Pytagoras machen, sondern
mit dem Cosinus-Satz.a² = b² + c² – 2 b c cos(a)
http://www.mathewissen.de/klasse10/kosinus.phpWäre gut, wenn du dir diese Seite verinnerlichst, dieser Inhalt wird dich dein Leben lang verfolgen.
(Kann sein, dass du den Link in den Browser kopieren muss)
-
Ich beschreib es dir kurz an einem Beispiel:
P2 /| / | /__| PP=(x,y) ist die Ausgangsposition und P2=(x2,y2) das Ziel. Die Strecken zwischen P und P2 bildet die Hypothenuse. Die Kathete unten errechnet sich aus (x2-x) und die Kathete rechts aus (y2-y). Den Winkel alpha zwischen der Hypothenuse und der Ankathete unten bekommst du aufgrund der Beziehung tan(alpha)= Gegenkathete/Ankathete durch:
alpha = arctan(Gegenkathete/Ankathete unten) = arctan( (y2-y)/(x2-x) )
Aus dem Winkel kannst du dann leicht eine Rotationsmatrix bauen.Falls die 2 Punkte auf einer Linie liegen (x=x2 oder y=y2) entartet das Dreieck zu einer einzigen Strecke. Das ist jedoch auch kein Problem, da in diesem Fall Alpha in der Menge {0,90,180,270} liegen muss (was man leicht durch Fallunterscheidungen ermitteln kann).
-
Nock schrieb:
Hoi,
Ich würde es nichtmals mit dem Satz des Pytagoras machen, sondern
mit dem Cosinus-Satz.a² = b² + c² – 2 b c cos(a)
http://www.mathewissen.de/klasse10/kosinus.phpWäre gut, wenn du dir diese Seite verinnerlichst, dieser Inhalt wird dich dein Leben lang verfolgen.
(Kann sein, dass du den Link in den Browser kopieren muss)
Wieso sollte man den Kosinussatz nehmen? Das Rechteck ist ja sowieso rechtwinklig und beim Kosinussatz benötigst du mehr Operationen.
-
interpreter schrieb:
Ich beschreib es dir kurz an einem Beispiel:
P2 /| / | /__| PP=(x,y) ist die Ausgangsposition und P2=(x2,y2) das Ziel. Die Strecken zwischen P und P2 bildet die Hypothenuse. Die Kathete unten errechnet sich aus (x2-x) und die Kathete rechts aus (y2-y). Den Winkel alpha zwischen der Hypothenuse und der Ankathete unten bekommst du aufgrund der Beziehung tan(alpha)= Gegenkathete/Ankathete durch:
alpha = arctan(Gegenkathete/Ankathete unten) = arctan( (y2-y)/(x2-x) )
Aus dem Winkel kannst du dann leicht eine Rotationsmatrix bauen.Falls die 2 Punkte auf einer Linie liegen (x=x2 oder y=y2) entartet das Dreieck zu einer einzigen Strecke. Das ist jedoch auch kein Problem, da in diesem Fall Alpha in der Menge {0,90,180,270} liegen muss (was man leicht durch Fallunterscheidungen ermitteln kann).
Danke. (Sorry wenn ich mich dumm anstelle) Aber in math.h gibt es keine Funktion arctan(). Wie kann ich so eine Funktion selber schreiben?
-
Die Funktion heißt atan().
-
interpreter schrieb:
Die Funktion heißt atan().
Vielen Dank! Jett funktioniert das wunderbar.
-
Bitte

-
interpreter schrieb:
Bitte

Oh, ich fürchte, ich muss dich nochmal belästigen.
Ich habe jetzt folgendes ausprobiert:
Zwei Figuren.
Die erste Figur wird tastaturgesteuert bewegt.
Die zweite Figur wird NICHT bewegt sondern schaut die ganze Zeit auf Figur 1.(Hab eine Funktion "LookAt(int xpos , int ypos)" geschrieben so wie u es gesagt hast: atan((x2-x) / (y2-y); ))
Das Problem ist jetzt folgendes:
1 : Die zweite Figur (die zugleich auf die erste Figur schaut), schaut schon in die Richtung der erste Figur. Allerdings findet diese Drehung (in die entsprechende Richtung) nur ruckelig statt.
Und noch was komisches:Die zweite Figur richtet sich plötzlich auf 0 Grad aus, wenn die 45 Grad-Marke überschritten wurde. (Wenn Figur 1 so darsteht, dass die Rotation der Figur2 45 Gad überschreitet.)
ps: Ja, ich hab Radianten in Grad umgerechnet.
Ich hoffe, dass du (oder auch jemand anders) helfen kannst.
-
*push*
Kann mir niemand helfen?

-
ich wolte dir ja helfen aber jemmand hat den betirag geloescht^^
ich hatte geschrieben das du dir ein c++ tutorail ankucken solst am besten das von www.volkard.de den das ist gut ^^
alternartiv kanst du auch alles mit tangens machen und vieleicht hast du die positionen als integer diviediert und deshalb rukelt es so^^

-
strummelbunzi schrieb:
ich wolte dir ja helfen aber jemmand hat den betirag geloescht^^
ich hatte geschrieben das du dir ein c++ tutorail ankucken solst am besten das von www.volkard.de den das ist gut ^^
alternartiv kanst du auch alles mit tangens machen und vieleicht hast du die positionen als integer diviediert und deshalb rukelt es so^^

Tu mir einen gefallen. Poste in nächster Zeit bitte NICHT in Threads, die von MIR erstellt worden sind.
Danke.
Back to topic:
Warum wird der Wert bei arctan (oder atan) nach 45 Grad , 0 Grad? Gibt es eine mathematische Erklärung oder muss der Fehler in meinem Programm liegen?
-
der feller liegt in deinem programm ^^
ich habe dir doch gesaggt das du woll die integers dividierst und das "ruckelt" ^^
-
strummelbunzi schrieb:
der feller liegt in deinem programm ^^
ich habe dir doch gesaggt das du woll die integers dividierst und das "ruckelt" ^^1 : Stimmt. Hab durch integer dividiert.
2 : Hab deinen letzten post nicht gelesen, da ich nicht alles lese, was du schreibst.
-
Was heißt NACH 45 Grad? Und atan übergibt man keine Winkel. Da die Winkelfunktionen keine bijektiven Abbildungen sind, kannst du nicht einfach so bedenkelos umkehren, sondern musst dir stets genau die einzelnen Intervalle anschauen.
-
interpreter schrieb:
Was heißt NACH 45 Grad? Und atan übergibt man keine Winkel. Da die Winkelfunktionen keine bijektiven Abbildungen sind, kannst du nicht einfach so bedenkelos umkehren, sondern musst dir stets genau die einzelnen Intervalle anschauen.
Hat sich erledigt. Diesmal hatte strummelbunzi recht. Ich hab durch ints geteilt statt durch doubles. Jetzt funktioniert es einwandfrei.
Danke.
(zu 45 Grad: Ich hab während der Laufzeit die Winkelgröße ausgenen lassen. Und nach 45 Grad zeigte es 0 an. Aber das Problem besteht NICHT mehr. Funktioniert wie gesagt: EINWANDFREI!)
-
das war auch der grund weshalb ich seinen trollbeitrag nicht gelöscht hab und er ärgert sich jetzt sicherlich sehr mit seinem schnellschuss doch mal geholfen zu haben *hahaha...*