旋转另一点的点(2D)

我正在试图制作一个纸牌游戏的卡片扇出。 现在显示它使用Allegro API,它有一个function:

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

所以这个我可以很容易地使我的粉丝效果。 问题是知道哪个卡在鼠标下。 要做到这一点,我想到做一个多边形碰撞testing。 我只是不知道如何旋转卡上的4个点来组成多边形。 我基本上需要做和Allegro一样的操作。

例如,卡的4个点是:

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

我需要一个像这样的function:

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

谢谢

哦,这很容易。首先减去枢轴点(cx,cy),然后旋转它,然后再次添加点。

未经testing:

 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; } 

如果你通过angular度theta旋转点(px, py) (ox, oy)的点(px, py) (ox, oy)你会得到:

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

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

这是在2D中旋转点的简单方法。

屏幕上的坐标系是左手的,即x坐标从左到右增加, y坐标从上到下增加。 原点O(0,0)位于屏幕的左上angular。

在这里输入图像描述

围绕坐标(x,y)的点的原点 顺时针旋转由以下等式给出:

在这里输入图像描述

其中(x',y')是旋转后的点的坐标和angular度theta,旋转的angular度(需要以弧度表示,即乘以:PI / 180)。

要围绕与原点O(0,0)不同的点进行旋转,我们假设点A(a,b)(轴心点)。 首先我们通过减去轴心点的坐标(x – a,y – b)来将要旋转的点(即(x,y))转换回原点。 然后我们执行旋转并获得新的坐标(x',y'),最后通过将枢轴点的坐标添加到新的坐标(x'+ a,y'+ b)来将点转换回来。

遵循以上描述:

(a,b)周围的点(x,y)的二维顺时针θ旋转为:

使用你的函数原型:(x,y) – >(px,py); (a,b)→(cx,cy); θ – >angular度:

 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 

对于顺时针旋转:

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

对于逆时针旋转:

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