Вычисление градусов между двумя точками с обратной осью Y

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

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

Как бы я это сделал?


person skerit    schedule 22.07.2010    source источник
comment
Угол обзора откуда?   -  person Christopher Creutzig    schedule 22.07.2010
comment
Я не понимаю, как вы определяете угол ... вы все время смотрите в определенном направлении?   -  person rownage    schedule 22.07.2010
comment
@rownage: Если я не ошибаюсь, суть в том, чтобы определить ориентацию вектора, который указывает из одной позиции в другую.   -  person Tim Goodman    schedule 22.07.2010
comment
@Tim: Да, я потерялся там, я понял, что происходит, увидев ответ KennyTM (ничего лучше, чем хороший ответ, чтобы помочь понять вопрос)   -  person rownage    schedule 22.07.2010


Ответы (4)


Предположим, вы находитесь в точке (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.

person kennytm    schedule 22.07.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), и соответствующим образом настроить его.

person Tim Goodman    schedule 22.07.2010
comment
На самом деле мне больше нравится ответ KennyTM. Math.atan2 будет знать, в каком квадранте вы уже находитесь, поэтому вы избавлены от последнего шага. - person Tim Goodman; 22.07.2010
comment
Я все еще нашел этот ответ полезным, это хорошая альтернатива, потому что я хочу сам контролировать квадранты. - person Partack; 25.06.2014

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

function pointDirection(x1, y1, x2, y2) {
    return Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI;
}
person Petah    schedule 23.06.2015

В холсте HTML5 источником является верхний левый угол, поэтому ось Y растет сверху вниз. Таким образом, независимо от того, где вы находитесь на единичном круге, чтобы вычислить угол точки A к центру (C), вы должны фактически сделать так:

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

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

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

person Redu    schedule 27.11.2016