Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

12.06.2013, 12:47

Rotation Punkt um Punkt

Hey,

kann mir jemand mal bei der Mathematik folgender Funktion nachhelfen?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Return a rotated version of this point.
    // hotspot: The point around which to rotate.
    // angle: The amount of degrees to rotate by, clockwise.
    GL_point rotate( const GL_point &hotspot, float angle ) const
    {
        //Move the hotspot to 0,0
        GL_point r(m_x - hotspot.m_x, m_y - hotspot.m_y);
        
        // distance between point & hotspot
        const float c = static_cast<float>(sqrt(r.m_x*r.m_x + r.m_y*r.m_y));
        const float nw = static_cast<float>(atan2(r.m_y, r.m_x) + ((angle + 180) * M_PI / 180));
        r.m_x = static_cast<float>((sin(1.5 * M_PI - nw) * c) /*+ 0.5*/) + hotspot.m_x;
        r.m_y = -static_cast<float>((sin(nw) * c) /*+ 0.5*/) + hotspot.m_y;

        return r;
    }


r ist also der Punkt in das lokale Koordinatensystem des Hotspots transformiert, c müsste dann die Distanz zwischen Punkt und Hotspot sein, aber was in nw berechnet wird, erschließt sich mir schon nicht so ganz. Anscheinend ist das der Winkel zwischen Hotspot und Punkt + gewünschtem Rotationswinkel + 180° in Radiants. Aber wozu die 180°? Müsste ich die nicht einfach weglassen, wenn ich ne normale Rotation will oder 360° - Hotspot/Punkt-Winkel - gew. Rotationswinkel berechnen, wenn die Rotation im Uhrzeigersinn laufen soll? Entsprechend verstehe ich überhaupt nicht mehr, was im nächten Schritt dieser Sinus von 3/2 PI - nw sein soll...
Erstaunlicherweise scheint aber wirklich das Richtige herauszukommen O_o

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

2

12.06.2013, 15:09

EDIT: Mehr als du finde ich auch nicht heraus.

3

12.06.2013, 15:29

Hab auch noch mal nen edit: Die Rotation ist am Ende nicht im Uhrzeigersinn, sondern ganz normal entgegen.
Und die Sache mit 360° - bla dürfte auch Quatsch sein...

birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

4

12.06.2013, 16:24

C-/C++-Quelltext

1
2
3
4
float xtemp = m_x;

m_x = hotspot.m_x + cos(DegToRadWasWeißIch(angle)) * (m_x - hotspot.m_x) - sin(DegToRad(angle)) * (m_y - hotspot.m_y);
m_y = hottpot.m_y + sin(DegToRad(angle)) * (xtemp - hotspot) + cos(DegToRad(angle)) * (m_y - hotspot.m_y);


Funktioniert das ?
Wenn ja schau dir die seite an:
http://www.hinterseher.de/Diplomarbeit/Transformation.html

Tobiking

1x Rätselkönig

  • Private Nachricht senden

5

12.06.2013, 16:33

Das atan deutet auf Polarkoordinaten hin. Das c ist dann die Abstandskoordinate und nw müsste die Rotationskoordinate nach der Rotation sein. Das ganze relativ zum Hotspot, so das nach der Umwandlung ins kartesische Koordinatensystem noch um den Hotspot verschoben werden muss.

Allerdings sieht das für mich auf den ersten Blick unnötig kompliziert aus. Für die x-Koordinate verwendet man üblicherweise den Cosinus. In dem Code sieht das so aus als wenn der Winkel um 90 Grad gedreht wurde um den Sinus verwenden zu können. Und auch für die y-Koordinate nimmt man eigentlich den positiven Wert, es sein denn man dreht es vorher um 180 Grad wie es geschehen ist. Es wäre möglich das atan2 das wegen Vorzeichen nötig macht, aber das müsste man mal genauer durchrechnen.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

6

12.06.2013, 16:43

Das mit dem atan ist allgemein Quatsch und macht die Sache zu kompliziert, das mit den 180 Grad kommt daher, dass nw dann falsch benutzt wird. Du solltest den Vektor den zwischen den Punkten einfach mit einer Rotationsmatrize multiplizieren und dann zum Hotspot addieren, fertig!

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

7

12.06.2013, 17:45

Rotationsmatrix. Aber ist richitg, den ganzen Aufwand kann man sich sparen, wenn man einfach mit zwei Matrizen für Rotation und Verschiebung arbeitet.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Werbeanzeige