Это правильный метод использования точечного произведения, чтобы найти угол между двумя векторами? C ++ SFML

0

Поэтому в другом вопросе мне сказали, что вы можете использовать упрощенную формулу точечного произведения, чтобы найти угол между двумя векторами:

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

Кроме того, из того, что я понял, он просто берет точки как векторы. Вот почему позиция мыши и игрока подключена к параметрам. Однако, когда я перемещаю мышь вокруг игрока в радиусе 360 градусов, угол и, следовательно, вращение проигрывателя - это значение от -0.3... до -1.4... Это неверно метод? Я должен представлять векторы не как позиции X, Y, а как что-то еще?

Там также была найдена другая формула, которая также не работает для меня:

angle = atan2(mouseY - yPos, mouseX - xPos);
Теги:
vector
sfml
angle

1 ответ

1

Первый метод правильный, второй - неправильный. Функция atan2(x,y) вычисляет угол в радианах вектора, указывающего от (0,0) до (x,y) относительно оси x. Таким образом, правильно рассчитать два угла (в радианах) векторы имеют отношение к оси х, а затем вычесть их друг из друга, чтобы получить углы между этими двумя векторами.

Результатом функции atan2 является значение в полуоткрытом интервале (-pi,pi] выраженное в градусах, это соответствует (-180°,180°). 0 °, таким образом, обозначает вектор, указывающий вправо (вдоль ось х), 90 ° - вектор, направленный вверх, 180 ° вектор, указывающий влево, и -90 ° вектор, указывающий вниз.

Вы можете преобразовать результат в радианах в углы по формуле

atan(x,y)*180/pi

Итак, если вы хотите преобразовать полученные результирующие значения в углы, просто умножьте их на 180/pi.

  • 0
    Спасибо за помощь, но вращение кажется немного выключенным. Он действительно поворачивается с севера на восток на юго-восток, только если я делаю полный оборот вокруг оси, и X, Y спрайта центрированы. Я не уверен, где я ошибся, но вот код: double angle = atan2 (mousey + yPos, mousex - xPos); угол = угол * (180 / 3,14159); ship.setRotation (угол);
  • 0
    Как написано в ответе, вы должны использовать свой первый вариант, то есть atan2(mouseY, mouseX) - atan2(yPos, xPos); Кроме того, вы должны спросить себя, где находится источник вашей системы координат, и соответствующим образом изменить свой ввод. Итак, где на вашем мониторе находится точка (0,0)?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню