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

新手上路,请多包涵

我正在尝试制作纸牌游戏,其中纸牌呈扇形散开。现在要显示它,我使用具有以下功能的 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)
{
}

谢谢

原文由 jmasterx 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

原文由 Nils Pipenbrinck 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

在此处输入图像描述

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

在此处输入图像描述

其中(x’, y’) 是旋转后点的坐标和角度theta,旋转的角度(需要以弧度为单位,即乘以:PI/180)。

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

按照上面的描述:

(x, y) 围绕点 (a, b) 的 2D 顺时针 theta 度 旋转是:

使用您的函数原型: (x, y) -> (px, py); (a, b) -> (cx, cy); θ-> 角度:

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

     return POINT(cos(angle) * (p.x - cx) - sin(angle) * (p.y - cy) + cx,
                  sin(angle) * (p.x - cx) + cos(angle) * (p.y - cy) + cy);
}

原文由 Ziezi 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题