小编典典

围绕另一个点旋转一个点 (2D)

all

我正在尝试制作纸牌游戏,其中纸牌呈扇形散开。现在要显示它,我使用具有以下功能的 Allegro API:

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

所以有了这个我可以很容易地制作我的风扇效果。然后问题是知道鼠标在哪张卡下。为此,我想进行多边形碰撞测试。我只是不确定如何旋转卡上的 4
个点来组成多边形。我基本上需要做和 Allegro 一样的操作。

比如这张牌的4点是:

card.x

card.y

card.x + card.width

card.y + card.height

我需要一个类似的功能:

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

谢谢


阅读 63

收藏
2022-07-29

共1个答案

小编典典

首先减去枢轴点(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;
}
2022-07-29