c++ - 这是使用点积求两个 vector 之间角度的正确方法吗? C++ SFML

标签 c++ vector sfml angle

所以在另一个问题中有人告诉我,您可以使用点积的简化公式来计算两个 vector 之间的角度:

angle = atan2(mouseY, mouseX) - atan2(yPos, xPos); //xPos, yPos is position of player

除此之外,根据我的理解,它只是将点作为 vector 。这就是为什么将鼠标和播放器位置插入参数中的原因。但是,当我在 360 度半径范围内围绕播放器移动鼠标时,播放器的角度和旋转值约为 -0.3... 到 -1.4... 这不是正确的方法吗?我是否应该将 vector 表示为其他东西而不是 X、Y 位置?

还有一个我发现的公式似乎也不适合我:

angle = atan2(mouseY - yPos, mouseX - xPos);

最佳答案

第一种方法正确,第二种方法错误。函数 atan2(x,y) 计算从 (0,0) 指向 (x ,y) 相对于 x 轴。因此,计算 vector 相对于 x 轴的两个角度(以弧度为单位)然后将它们彼此相减以获得两个 vector 之间的角度是正确的。

函数 atan2 的结果是半开区间 (-pi,pi] 中的一个值。以度数表示,这对应于 ( -180°,180°)。因此,0° 表示指向右(沿 x 轴)的 vector ,90° 表示向上的 vector ,180° 表示向左的 vector ,-90° 表示向下的 vector 。

您可以通过公式将以弧度为单位的结果转换为角度

atan(x,y)*180/pi

因此,如果您想将结果值转换为角度,只需将它们乘以 180/pi

关于c++ - 这是使用点积求两个 vector 之间角度的正确方法吗? C++ SFML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27052063/

相关文章:

c++ - 当通过 const 引用传递的对象被添加到像 std::map 这样的容器时会发生什么?

c++ - 你如何在 SFML 中制作可点击的 Sprite ?

c++ - SFML游戏开发书籍——理解FPS计算

c++ - 将 unsigned char 字符串从 native 客户端模块发送到浏览器

c++ - 为 C++ 库创建 podspec

c++ - 是否可以在编译时将 gcc 编译标志检测为宏?

c++ - 如何复制除一个特定元素外的 vector ?

c++ - 如何防止从 `0` 构造 std::string 引起的麻烦?

java - 在 Vector 中查找包含最多元素的对象

c++ - vector 的 std::copy 无法正常工作