【问题标题】:C++/SDL angle from one object to another从一个对象到另一个对象的 C++/SDL 角度
【发布时间】:2019-01-01 01:06:31
【问题描述】:

我想将二维图像沿我单击的方向旋转到所有象限。为此,我需要计算相对于对象的角度。我需要 2 个向量。

我尝试过这样做:一个向量将是“点击”点,另一个将是一个“假想”水平向量,它与对象的 X 与“点击”点相同,但 Y 的 Y目的。这将作为我计算与对象角度的第二个向量。

我制作了一个包含 3 个对象的测试程序,看看我是否可以得到这些角度。 b6 是对象,b7 是距离 b6 大约 45º 的“点击点”,b8 是距离 b6 大约 135º 的另一个“点击点”。

这是我正在使用的代码:

#define PI 3.14159265

int main(int argc, char** argv) {

   Button b6(100,100); 
   Button b7(150,50);
   Button b8(150,150);

   int dot1 = b7.getX() * b7.getX() + b7.getY() * b6.getY();
   int det1 = b7.getX() * b6.getY() - b7.getY() * b7.getX();
   double angle1 = atan2(det1,dot1)* 180/PI;

   int dot2 = b8.getX() * b8.getX() + b8.getY() * b6.getY();   
   int det2 = b8.getX() * b6.getY() - b8.getY() * b8.getX();
   double angle2 = atan2(det2,dot2)* 180/PI;
}  

结果与b7b8的实际位置不对应。 angle1 是 15.25,angle2 是 -11.31。

我是这方面的新手,我不知道我在做什么是不是一团糟。谁能帮我计算这些角度?

【问题讨论】:

  • 对我来说,通过看似随机配对的 X 和 Y 坐标相互乘积,我有点不清楚您希望实现什么。如果我想知道两个笛卡尔坐标之间的距离(作为计算它们与轴的相对角度的前奏),我希望使用的数学运算将是减法。
  • 你的例子应该减少,Button 类型是完全没有必要的,只是混淆了一些东西。此外,与 SDL 没有任何关系。

标签: c++ math sdl


【解决方案1】:

正如 Sam 在评论中所写的那样 - 不清楚 OP 想要通过 dotdet 实现什么。这听起来有点像点积,但这里没有必要。

从一个点到另一个点的向量只是点的减法(点向量)。

点向量的减法就是向量分量的减法。

atan2() 中使用这些向量的分量可提供这些向量的斜率:

#include <iostream>
#include <cmath>

const double Pi = 3.14159265;

struct Vec2 {
  const double x, y;
  Vec2(double x, double y): x(x), y(y) { }
  ~Vec2() = default;
  Vec2(const Vec2&) = default;
  Vec2& operator=(const Vec2&) = delete;
};

int main()
{
  const Vec2 b6(100, 100);
  const Vec2 b7(150, 50);
  const Vec2 b8(150, 150);
  // vector b6->b7
  const Vec2 b67(b7.x - b6.x, b7.y - b6.y);
  // vector b6->b8
  const Vec2 b68(b8.x - b6.x, b8.y - b6.y);
  // slope b67
  const double angle1 = atan2(b67.y, b67.x) * 180 / Pi;
  // slope b68
  const double angle2 = atan2(b68.y, b68.x) * 180 / Pi;
  // output
  std::cout
    << "angle1: " << angle1 << '\n'
    << "angle2: " << angle2 << '\n';
  // done
  return 0;
}

输出:

angle1: -45
angle2: 45

Live Demo on coliru

Vec2 实例的示意图:

【讨论】:

  • 谢谢谢夫。使用您的代码,我得到准确的角度。但是,问题是,我需要从 0 到 360 的结果。您的代码只给出从 0 到 180(从 90 开始)的结果,最糟糕的是上象限从逆时针方向开始。我试图调整代码,但我无法得到可以使用它的东西。有什么办法吗?
  • @Dar-kol 这可能取决于 (0, 0) 的位置。在 OpenGL 中(与数学中一样),它位于左下角。在 2D 图形中,它通常位于左上角。在后一种情况下,它也可以正常工作,但会产生垂直镜像的结果。例如。正旋转是顺时针(而不是像数学和 OpenGL 中通常的逆时针)。
  • @Dar-kol 关于角度:根据文档。 std::atan2() 如果没有错误发生,则返回 (-π , +π] 弧度范围内的 y/x (arctan(y, x)) 的反正切。 如果您更喜欢范围 [0, 360],您可以转换 atan2() 的返回结果,例如通过 fmod(angle + 2 * Pi, 2 * Pi)。顺便说一句。我想知道您为什么坚持使用正角度。对于大多数有关角度或圆的操作,270° 没有与 -90° 的差异(当然,这取决于在进一步处理中应如何使用角度)。
  • 我已经交换了 Vec2 操作中的对象。现在对象旋转到我单击的位置。好吧,仍然不完美,因为它希望它向点击点移动,它仍然不完美,但我越来越近了,那是另一个问题。
猜你喜欢
  • 1970-01-01
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2011-02-07
相关资源
最近更新 更多