旋转另一点的点(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;