Ich versuche ein Kartenspiel zu machen, bei dem die Karten auffächern. Im Moment benutze ich die Allegro-API, die eine Funktion hat:
al_draw_rotated_bitmap(OBJECT_TO_ROTATE,CENTER_X,CENTER_Y,X
,Y,DEGREES_TO_ROTATE_IN_RADIANS);
So kann ich meinen Fan-Effekt leicht machen. Das Problem ist dann zu wissen, welche Karte sich unter der Maus befindet. Dazu habe ich mir überlegt, einen Polygonkollisionstest durchzuführen. Ich bin mir nur nicht sicher, wie ich die 4 Punkte auf der Karte drehen soll, um das Polygon zu bilden. Ich muss im Grunde die gleiche Operation wie Allegro durchführen.
Zum Beispiel sind die 4 Punkte der Karte:
card.x
card.y
card.x + card.width
card.y + card.height
Ich würde eine Funktion brauchen wie:
POINT rotate_point(float cx,float cy,float angle,POINT p)
{
}
Vielen Dank
Wenn Sie Punkt
(px, py)
um Punkt(ox, oy)
um Winkel Theta drehen, erhalten Sie:p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox
p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy
Dies ist eine einfache Möglichkeit, einen Punkt in 2D zu drehen.
quelle
Das Koordinatensystem auf dem Bildschirm ist linkshändig, dh die x- Koordinate nimmt von links nach rechts und die y- Koordinate von oben nach unten zu. Der Ursprung O (0, 0) befindet sich in der oberen linken Ecke des Bildschirms.
Eine Drehung im Uhrzeigersinn um den Ursprung eines Punktes mit Koordinaten (x, y) wird durch die folgenden Gleichungen gegeben:
Dabei sind (x ', y') die Koordinaten des Punktes nach der Drehung und der Winkel Theta der Drehwinkel (muss im Bogenmaß angegeben werden, dh multipliziert mit: PI / 180).
Um eine Drehung um einen Punkt durchzuführen, der sich vom Ursprung O (0,0) unterscheidet, sagen wir Punkt A (a, b) (Drehpunkt). Zunächst übersetzen wir den zu drehenden Punkt, dh (x, y), zurück zum Ursprung, indem wir die Koordinaten des Drehpunkts (x - a, y - b) subtrahieren. Dann führen wir die Drehung durch und erhalten die neuen Koordinaten (x ', y') und übersetzen schließlich den Punkt zurück, indem wir die Koordinaten des Drehpunkts zu den neuen Koordinaten (x '+ a, y' + b) addieren.
Nach der obigen Beschreibung:
Eine 2D- Drehung des Punktes (x, y) um Theta-Grad im Uhrzeigersinn um Punkt (a, b) ist:
Verwenden Ihres Funktionsprototyps: (x, y) -> (px, py); (a, b) -> (cx, cy); Theta -> Winkel:
quelle
Für Drehung im Uhrzeigersinn:
Bei Drehung gegen den Uhrzeigersinn:
quelle
c
unds
?c = cos(angle)
Dies ist die Antwort von Nils Pipenbrinck, aber in c # fiddle implementiert.
https://dotnetfiddle.net/btmjlG
Ps: Anscheinend kann ich keinen Kommentar abgeben, daher bin ich verpflichtet, ihn als Antwort zu posten ...
quelle