Mit Rotationsmatrix Objekt drehen
-
Hi,
Ich habe gerade ein mathematisches Problem, bei dem mir (wie so oft) meine bisherige Schulmathematik nicht weiterhilft.
In meinem Programm zeichne ich ein Dreieck auf den Bildschirm indem ich Linien zwischen drei Punkten ziehe (werden mithilfe der Größe und der Position berechnet). Nun soll dieses Dreieck in die Richtung zeigen in die es sich bewegt. Die Bewegungsrichtung gibt ein Vektor an.Wie bekomme ich die einzelnen Punkte nun so hin, dass das Dreieck (mit spitzem Winkel) in die Bewegungsrichtung zeigt? Kamera drehen geht in diesem Fall nicht, da es gar keine gibt (relativ einfache wxWidgets Operationen)
Laut google kann man das mit einer Rotationsmatrix anstellen, aber wie multipliziere ich einen Vektor mit einer Matrix? Und wie komme ich dann auf meine einzelnen Koordinaten?
Danke!
P.S: Da es sich nur um einfach 2D Objekte handeln empfand ich es als "zu viel" hier mit OpenGL oder ähnlichem zu arbeiten, sonst wäre das natürlich um einiges einfacher.
-
Da du schon um die Bewegungsrichtung des Dreiecks zu bestimmen bzw. den Winkel um den es gedreht werden muss, ein bisschen Grundwissen an analytischer Geometrie brauchst, solltest du dich mit dem Thema evtl. auseinandersetzen. Matrizenmultiplikationen wird dir dann schnell als eines der ersten Themen über den Weg laufen.
-
Da es nur 2D ist, handelt es sich dabei doch im Grunde nur um das einfache Drehen eines Punktes um einen bestimmten Mittelpunkt in einem bestimmten Winkel.
(also die Eckpunkte des Dreieckes um dessen Mittelpunkt, der im einfachsten Fall (0|0) ist)Gabs zwar schon oft im Forum, aber egal:
newX = p.x * cos(winkel) - p.y * sin(winkel); newY = p.x * sin(winkel) + p.y * cos(winkel);
Haettest du dich mit Rotationsmatrizen beschaeftigt, waerst du am Ende wohl auf das Gleiche gekommen
Denk daran, dass Computer immer mit Bogenmass rechnen! Du musst den Winkel also gegebenenfalls noch umrechnen.
-
Hallo an alle,
nur um den vorherigen Beiträgen etwas hinzuzufügen:
Da du einen Vektor hast, solltest du nicht unbedingt den Umweg über den Winkel
gehen. Den Kosinus und Sinus bekommste über deren Beziehung im Einheitskreis.Viele Grüße Chuck
-
Wie meinst du das? Ich hätte nun den Winkel per Tangens berechnet den ich brauche.
-
Abend.
Du hattest doch erwähnt, dass du einen Vektor hast, der dir die
Bewegungsrichtung des Dreiecks liefert. Quasi so:
v = (x, y)Und wenn du dir das ganze einmal aufzeichnest, dann wirst du Folgendes
feststellen:
cos winkel = x / |v|
sin winkel = y / |v|Wie gesagt, nur eine Ergänzung.
Grüße Chuck
-
Hmm,
Ich hatte gerade eben mal Zeit den Code zu implementieren, aber irgendwie sind meine Dreieck nicht mehr da wo sie sein sollte. (Zum Testen hab ich einen Kreis im Mittelpunkt zeichnen lassen, alle Dreiecke waren außerhalb)
Hier mal mein code:double xKoord = GetPositionVector().GetXKoord(); double yKoord = GetPositionVector().GetYKoord(); double len = GetDirectionVector().GetLength(); wxPoint point[3]; //Die drei Koordinaten, damit zeigt die spitze Seite nach unten (90°) //GetSize() = Größe des Dreieckes point[0] = wxPoint(xKoord + GetSize()/2, yKoord - GetSize()/2); point[1] = wxPoint(xKoord, yKoord + GetSize()/2 + 10); point[2] = wxPoint(xKoord - GetSize()/2, yKoord - GetSize()/2); //Hier nun die Drehung ohne Winkel for (int i = 0; i < 3; ++i) point[i] = wxPoint(point[i].x * (GetDirectionVector().GetXKoord()/len) - point[i].y * (GetDirectionVector().GetYKoord()/len), point[i].x * (GetDirectionVector().GetYKoord()/len) + point[i].y * (GetDirectionVector().GetXKoord()/len));
Ich weiss der Code sieht sehr wirsch aus, da ich manchmal direkt auf Variable zugreife und manchmal diese erst zwischenspeichere - dass werde ich alles nochmal ändern. Aber erstmal möchte ich eine laufende Version hinbekommen.