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

时间:2018-12-31 14:23:02

标签: c++ math sdl

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

我尝试这样做:一个向量是“点击”点,另一个向量是一个“虚构”水平向量,它离开对象时具有与“点击”点相同的X,但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。

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

1 个答案:

答案 0 :(得分:0)

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

A Sketch of the Vec2 instances