Girar un punto sobre otro punto (2D)

Intento hacer un juego de cartas donde las cartas se despliegan. Ahora mismo para mostrarlo Estoy usando la API Allegro que tiene una función:

al_draw_rotated_bitmap(OBJECT_TO_ROTATE,CENTER_X,CENTER_Y,X ,Y,DEGREES_TO_ROTATE_IN_RADIANS); 

así que con esto puedo hacer que mi ventilador tenga efecto fácilmente. El problema es saber qué tarjeta está debajo del mouse. Para hacer esto, pensé en hacer una prueba de colisión de polígono. Simplemente no estoy seguro de cómo rotar los 4 puntos en la tarjeta para formar el polígono. Básicamente necesito hacer la misma operación que Allegro.

por ejemplo, los 4 puntos de la tarjeta son:

 card.x card.y card.x + card.width card.y + card.height 

Necesitaría una función como:

 POINT rotate_point(float cx,float cy,float angle,POINT p) { } 

Gracias

Oh, eso es fácil … primero reste el punto de pivote (cx, cy), luego rótelo, luego agregue el punto nuevamente.

no probado:

 POINT rotate_point(float cx,float cy,float angle,POINT p) { float s = sin(angle); float c = cos(angle); // translate point back to origin: px -= cx; py -= cy; // rotate point float xnew = px * c - py * s; float ynew = px * s + py * c; // translate point back: px = xnew + cx; py = ynew + cy; return p; } 

Si gira el punto (px, py) alrededor del punto (ox, oy) por el ángulo theta obtendrá:

p'x = cos(theta) * (px-ox) - sin(theta) * (py-oy) + ox

p'y = sin(theta) * (px-ox) + cos(theta) * (py-oy) + oy

esta es una manera fácil de rotar un punto en 2D.

El sistema de coordenadas en la pantalla es zurdo, es decir, la coordenada x aumenta de izquierda a derecha y la coordenada y aumenta de arriba a abajo. El origen, O (0, 0) está en la esquina superior izquierda de la pantalla.

enter image description here

Una rotación en el sentido de las agujas del reloj alrededor del origen de un punto con coordenadas (x, y) viene dada por las siguientes ecuaciones:

enter image description here

donde (x ‘, y’) son las coordenadas del punto después de la rotación y el ángulo theta, el ángulo de rotación (debe ser en radianes, es decir, multiplicado por: PI / 180).

Para realizar la rotación alrededor de un punto diferente del origen O (0,0), digamos el punto A (a, b) (punto de pivote). Primero traducimos el punto a girar, es decir, (x, y) de vuelta al origen, restando las coordenadas del punto de pivote, (x – a, y – b). Luego llevamos a cabo la rotación y obtenemos las nuevas coordenadas (x ‘, y’) y finalmente trasladamos el punto hacia atrás, agregando las coordenadas del punto de pivote a las nuevas coordenadas (x ‘+ a, y’ + b).

Siguiendo la descripción anterior:

a 2D en sentido horario, theta grados de rotación del punto (x, y) alrededor del punto (a, b) es:

Usando su prototipo de función: (x, y) -> (px, py); (a, b) -> (cx, cy); theta -> ángulo:

 POINT rotate_point(float cx, float cy, float angle, POINT p){ return POINT(cos(angle) * (px - cx) - sin(angle) * (py - cy) + cx, sin(angle) * (px - cx) + cos(angle) * (py - cy) + cy); } 
 float s = sin(angle); // angle is in radians float c = cos(angle); // angle is in radians 

Para la rotación en sentido horario:

 float xnew = px * c + py * s; float ynew = -px * s + py * c; 

Para la rotación en sentido antihorario:

 float xnew = px * c - py * s; float ynew = px * s + py * c;