201 votes

Faire pivoter un point sur un autre point (2D)

Je suis en train de faire un jeu de cartes où les cartes en éventail. Maintenant pour l'afficher Im en utilisant l'Allegro de l'API 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 ventilateur se fait facilement. Le problème est alors de savoir quelle carte est sous la souris. Pour ce faire, j'ai pensé à faire un polygone d'essai de choc. Je ne suis pas sûr de la façon de tourner les 4 points de la carte pour faire le polygone. En gros, j'ai besoin de faire la même opération à l'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

454voto

Nils Pipenbrinck Points 41006

Oh, c’est facile… d’abord soustrayez le point de pivot (cx, cy), puis faites-le pivoter, puis rajoutez le point.

non testé:

 POINT rotate_point(float cx,float cy,float angle,POINT p)
{
  float s = sin(angle);
  float c = cos(angle);

  // translate point back to origin:
  p.x -= cx;
  p.y -= cy;

  // rotate point
  float xnew = p.x * c - p.y * s;
  float ynew = p.x * s + p.y * c;

  // translate point back:
  p.x = xnew + cx;
  p.y = ynew + cy;
  return p;
}
 

Si la rotation est exactement du mauvais côté, j'ai gâché la rotation. Dans ce cas c'est:

   float xnew = p.x * c + p.y * s;
  float ynew = -p.x * s + p.y * c;
 

(J'espère qu'un jour je me souviendrai de quelle manière est la bonne).

95voto

six face Points 219

Si vous faites pivoter les points (px, py) autour du point (ox, oy) selon 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 facile de faire pivoter un point en 2D.

35voto

Pour une rotation dans le sens des aiguilles d'une montre:

 float xnew = p.x * c + p.y * s;
float ynew = -p.x * s + p.y * c;
 

Pour une rotation anti-horaire:

 float xnew = p.x * c - p.y * s;
float ynew = p.x * s + p.y * c;
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X