在另一个点上旋转一个点(2D)
在另一个点上旋转一个点(2D)
我正在尝试制作一个能扇形展开的纸牌游戏。目前为了显示它,我正在使用 Allegro API,其中有一个函数:
al_draw_rotated_bitmap(OBJECT_TO_ROTATE,CENTER_X,CENTER_Y,X ,Y,DEGREES_TO_ROTATE_IN_RADIANS);
因此,我可以轻松地实现我的扇形效果。问题是如何知道鼠标下面的是哪张牌。为了做到这一点,我想使用一个多边形碰撞测试。我只是不确定如何旋转卡牌上的四个点来构成多边形。基本上,我需要执行与 Allegro 相同的操作。
例如,卡牌的四个点是:
card.x card.y card.x + card.width card.y + card.height
我需要一个像这个的函数:
POINT rotate_point(float cx,float cy,float angle,POINT p) { }
谢谢。
admin 更改状态以发布 2023年5月22日
首先减去枢轴点(cx,cy)
,然后顺时针旋转它,最后再加上该点。
未测试:
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; }