从一个对象到另一个对象的 C++/SDL 角度

C++/SDL angle from one object to another

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

我试过这样做:一个向量是 "click" 点,另一个是 "imaginary" 水平向量,离开与 [=32= 具有相同 X 的对象] 点,但带有对象的 Y。这将作为第二个向量,我将在其中计算与对象的角度。

我已经用 3 个对象制作了一个测试程序,看看我是否可以获得这些角度。 b6 是对象,b7 是 "click point" 与 b6 约 45º,b8 是另一个 "click point" 与 [=11= 约 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。

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

正如 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 个实例的草图: