J'essaye de faire un jeu de cartes où les cartes se déploient. En ce moment, pour l'afficher, j'utilise l'API Allegro qui a une fonction:
al_draw_rotated_bitmap(OBJECT_TO_ROTATE,CENTER_X,CENTER_Y,X
,Y,DEGREES_TO_ROTATE_IN_RADIANS);
donc avec cela je peux faire mon effet de fan facilement. Le problème est alors de savoir quelle carte se trouve sous la souris. Pour ce faire, j'ai pensé à faire un test de collision de polygones. Je ne sais tout simplement pas comment faire pivoter les 4 points sur la carte pour constituer le polygone. Je dois essentiellement faire la même opération qu'Allegro.
par exemple, les 4 points de la carte sont:
card.x
card.y
card.x + card.width
card.y + card.height
J'aurais besoin d'une fonction comme:
POINT rotate_point(float cx,float cy,float angle,POINT p)
{
}
Merci
Si vous faites pivoter le point
(px, py)
autour du point(ox, oy)
par l' angle thêta vous obtiendrez:p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox
p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy
c'est un moyen simple de faire pivoter un point en 2D.
la source
Le système de coordonnées à l'écran est gaucher, c'est-à-dire que la coordonnée x augmente de gauche à droite et la coordonnée y augmente de haut en bas. L'origine, O (0, 0) est dans le coin supérieur gauche de l'écran.
Une rotation dans le sens des aiguilles d' une montre autour de l'origine d'un point de coordonnées (x, y) est donnée par les équations suivantes:
où (x ', y') sont les coordonnées du point après rotation et l'angle thêta, l'angle de rotation (doit être en radians, c'est-à-dire multiplié par: PI / 180).
Pour effectuer une rotation autour d'un point différent de l'origine O (0,0), disons le point A (a, b) (point de pivot). Tout d'abord, nous traduisons le point à faire pivoter, c'est-à-dire (x, y) vers l'origine, en soustrayant les coordonnées du point de pivot, (x - a, y - b). Ensuite, nous effectuons la rotation et obtenons les nouvelles coordonnées (x ', y') et enfin nous traduisons le point en arrière, en ajoutant les coordonnées du point de pivot aux nouvelles coordonnées (x '+ a, y' + b).
Suite à la description ci-dessus:
une rotation 2D en thêta degrés dans le sens horaire du point (x, y) autour du point (a, b) est:
En utilisant votre prototype de fonction: (x, y) -> (px, py); (a, b) -> (cx, cy); thêta -> angle:
la source
Pour une rotation dans le sens des aiguilles d'une montre:
Pour une rotation anti-horaire:
la source
c
ets
?c = cos(angle)
C'est la réponse de Nils Pipenbrinck, mais implémentée en c # fiddle.
https://dotnetfiddle.net/btmjlG
Ps: Apparemment, je ne peux pas commenter, donc je suis obligé de le poster comme réponse ...
la source