Вычисление градусов между 2 точками с обратной осью Y - PullRequest
26 голосов
/ 22 июля 2010

Я создаю простую 2D-игру на javascript / canvas. Мне нужно выяснить угол наклона определенного объекта относительно моей позиции.

Итак: скажем, что я в (10,10), а объект в (10,5) - это приведет к 90 градусам (так как положительный Y вниз, отрицательный Y вверх) (10,10) против (10,15) будет 270 градусов.

Как бы я поступил об этом?

Ответы [ 4 ]

37 голосов
/ 22 июля 2010

Предположим, вы находитесь в точке (a, b), а объект в точке (c, d).Тогда относительное положение объекта для вас (x, y) = (c - a, d - b).

Тогда вы можете использовать функцию Math.atan2() , чтобы получитьугол в радианах.

var theta = Math.atan2(-y, x);

обратите внимание, что результат находится в диапазоне [-π, π].Если вам нужны неотрицательные числа, вы должны добавить

if (theta < 0)
   theta += 2 * Math.PI;

и преобразовать радианы в градусы, умножить на 180 / Math.PI.

6 голосов
/ 22 июля 2010

Если ваши координаты (xMe, yMe) и их координаты (xThem, yThem), то вы можете использовать формулу:

arctan((yMe-yThem)/(xThem-xMe))

Обычно это будет arctan((yThem-yMe)/(xThem-xMe)), но в этом случае знак оси Y меняется на противоположный.

Чтобы преобразовать результат из радианов в градусы, умножьте на 180 / pi.

Так в JavaScript это будет выглядеть так: Math.atan((yThem-yMe)/(xThem-xMe))*180/Math.PI

atan дает значение от -pi / 2 до pi / 2 (то есть от -90 до 90 градусов). Но вы можете посмотреть, в каком квадранте находится ваш вектор (xThem - xMe, yMe - yThem), и настроить его соответствующим образом.

4 голосов
/ 23 июня 2015

С точки зрения непрофессионала:

function pointDirection(x1, y1, x2, y2) {
    return Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI;
}
1 голос
/ 27 ноября 2016

На холсте HTML5 начало координат находится в верхнем левом углу, следовательно, ось y увеличивается сверху вниз. Таким образом, независимо от того, где вы находитесь на единичной окружности, чтобы вычислить угол точки А к центру (С), вам действительно нужно сделать следующее:

angle = Math.atan2(Cy-Ay,Ax-Cx)

, и вы получите свой результат в диапазоне [-π, π].

Понятия не имею, почему они не сделали начало холста нижним левым углом.

...