在另一个点上旋转一个点(2D)

5 浏览
0 Comments

在另一个点上旋转一个点(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日
0
0 Comments

如果你把点(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中旋转点的简单方法。

0
0 Comments

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

0