Угол C ++ / SDL от одного объекта к другому - PullRequest
0 голосов
/ 31 декабря 2018

Я хочу повернуть 2-D изображение в направлении, куда я нажимаю, ко всем квадрантам.Для этого мне нужно рассчитать угол относительно объекта.Мне нужно 2 вектора.

Я пытался сделать это: один вектор будет точкой «щелчка», другой - «воображаемым» горизонтальным вектором, отходящим от объекта с той же Х, что и «щелчок»."точка, но с Y объекта.Это послужило бы вторым вектором для расчета угла от объекта.

Я создал тестовую программу с 3 объектами, чтобы посмотреть, смогу ли я получить эти углы.b6 - это объект, b7 - это "точка щелчка" примерно в 45º от b6, а b8 - это еще одна "точка щелчка" примерно в 135º от b6.

Это кодЯ использую:

#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;
}  

Результаты не соответствуют фактической позиции b7 и b8.angle1 - это 15,25, angle2 - -11,31.

Я новичок в этом, и я не знаю, что я делаю, это полный беспорядок.Может ли кто-нибудь помочь мне вычислить эти углы?

1 Ответ

0 голосов
/ 31 декабря 2018

Как Сэм уже писал в комментарии - не ясно, чего ОП хочет добиться с dot и det.Это немного похоже на скалярное произведение, но в этом нет необходимости.

Вектор из одной точки в другую представляет собой просто вычитание точек (точечных векторов).

Вычитание точечных векторов простовычитание компонент вектора.

Использование компонентов этих векторов в 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

Демонстрация в реальном времени на coliru

Эскиз Vec2 экземпляров:

A Sketch of the Vec2 instances

...