【问题标题】:Radian of vector perpendicular to vector垂直于向量的向量弧度
【发布时间】:2016-03-22 00:29:19
【问题描述】:

我在(posX, posY)(mouseX, mouseY) 之间有一个向量,我通过allegro 的事件库将鼠标位置作为正整数。从这个向量使用反正切我得到(deltaX, deltaY) 的弧度。然后我将该弧度插入al_draw_rotated_bitmap 函数。我希望位图指向鼠标光标所在的位置,但我遇到的问题是弧度或矢量导致它垂直于光标旋转。

以下是相关代码:

void setRotation(int dx, int dy)
{
    float deltax = posX - mouseX;
    float deltay = posY - mouseY;

    rotation = atan2(deltay, deltax);
}

void Player::draw()
{
    al_draw_rotated_bitmap(player, al_get_bitmap_width(player) / 2, al_get_bitmap_height(player) / 2, posX, posY, rotation, 0);

}

int main()
{
    while(true)
    {
        player.setRotation(mouseX, mouseY);
        player.draw();
        al_flip_display();
    }
}

【问题讨论】:

  • 如果您能澄清您使用的输入、您预期会发生什么以及实际发生了什么,这可能会有所帮助。
  • @JimLewis 我刚刚编辑了帖子以包含更多细节。

标签: c++ allegro5


【解决方案1】:

想象(deltax, deltay) = (0, 100),即鼠标在对象上方100像素处,所以图片(我相信)根本不应该旋转。但是atan2(deltay, deltax) = atan2(100, 0) = π/2,这就是为什么你的图片是垂直旋转的。

要解决此问题,您应该将其更改为 atan2(deltax, deltay),可能在参数前添加 -,具体取决于 Allegro 中 X 和 Y 轴的方向,我不知道。

换句话说,atan2 测量相对于 X 轴的角度,但在你的情况下,角度应该相对于 Y 轴测量(因为 Y 轴上的对齐意味着没有旋转),所以你应该交换它的参数。

【讨论】:

  • 成功了,谢谢!它不再是 90 度角。但是现在当我顺时针移动鼠标时它会逆时针旋转,反之亦然。编辑:没关系,我只需要在反正切之前将 deltaX 设为负数。
  • 数学等价:PI/2
  • PI/2 - atan2(dy,dx)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 2016-12-16
  • 1970-01-01
  • 2017-06-18
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多