Вычисление угла между точками в JavaScript

Описание проблемы

При разработке игры мне нужно рассчитать угол для наведения камеры или оружия на основе позиции мыши и текущего положения объекта.

Текущий код

var playerLocation = this.gameObject.phy.pos
this.objectAngle = Math.atan((mouseX - playerLocation.x) / (mouseY - playerLocation.y)) * 57.2957795

Требования

  • Угол должен быть в градусах
  • Начальная позиция (0°) - слева
  • Возможность получения отрицательных углов при повороте

Нужна помощь в корректном расчете угла с учетом всех этих условий.

Как правильно реализовать расчет угла между двумя точками?

Могу подсказать более простой вариант. Лучше использовать Math.atan2(), он намного точнее работает. Код будет выглядеть так: let angle = Math.atan2(mouseY - playerY, mouseX - playerX) * 180 / Math.PI. Этот метод круче, потому что автоматом учитывает все квадранты и не надо заморачиватся с доп проверками. У меня в прошлом проекте было такое же геморное вычисление угла, пока не нашол этот способ. Работает на 100%, проверено!

Привет! Могу добавить еще один нюанс к решению. В моих проектах часто использую такой код для расчета угла: let angle = Math.atan2(dy, dx) * 180 / Math.PI + 180. Это позволяет сделать угол всегда положительным и привести его к диапазону 0-360 градусов. Плюс такого подхода - универсальность и простота. Работает заходяще во всех игровых механиках, где нужен точный угол поворота.

Кстати, есть еще один прикольный способ. Можно использовать Math.atan2() с доп условием для поворота на 90 градусов. Например: let angle = (Math.atan2(mouseY - playerY, mouseX - playerX) * 180 / Math.PI + 90) % 360. Это даст более гибкий подход к расчету угла в играх. У меня в одном проекте такой метод заходил идеально.

всё супер просто! можно еще немного упростить код. вот мой вариант: const angle = Math.atan2(dy, dx) * 180 / Math.PI + (dx < 0 ? 180 : 0). у меня в прошлых проектах такой способ заруливал на все 200%. главное - понимать математику за этими вычеслениями. в плюс этому методу то, что он работает практически в любых игровых сценариях, не важно 2д или 3д проект. если че, можно еще доработать под конкретную механику

В моей практике самый адекватный способ - использовать Math.atan2(). Лаконичный код: const angle = Math.atan2(mouseY - playerY, mouseX - playerX) * 180 / Math.PI. Точность 100%, работает для любых игровых механик. Главное преимущество - автоматический учет квадрантов и возможность получения углов в полном диапазоне. В реальных проектах этот метод выручал сотни раз.