Определить направление вектора движения от скорости
Я как бы смущен этим.
У меня есть объект, и я знаю, что это скорости по осям x и y. Моя проблема в том, как определить угол, под которым он движется.
function Object(){
this.velocity = {x: 5, y:1};
}
По сути, я знаю, что направление вектора - это x_projection*cos(deg) + y_projection*sin(deg), но я не знаю, как получить эти проекции, поскольку у меня есть только скорость, как я сказал, что я действительно сбит с толку.
РЕДАКТИРОВАТЬ:
в дополнение к принятому ответу, вот что я сделал, чтобы получить полный спектр 360 градусов
var addDeg = 0;
if(obj.velocity.x<0)
addDeg = obj.velocity.y>=0 ? 180 : 270;
else if(obj.velocity.y<=0) addDeg = 360;
deg = Math.abs(Math.abs(Math.atan(obj.velocity.y/obj.velocity.x)*180/Math.PI)-addDeg)
3 ответа
Я не знаю, как получить эти прогнозы, так как у меня есть только скорость
На самом деле, кажется, что вам не хватает того, что у вас уже есть прогнозы. Вот что такое х и у.
х скорость * cos(угол)
у скорость * грех (угол)
Таким образом, y/x = sin(угол)/cos(угол), который является tan (угол), так что угол =arctan(y/x).
Это угол, вращающийся против часовой стрелки, начиная с оси x (где x направлен вправо, а y направлен вверх).
Найдите угол между этим вектором и (1,0) (правое горизонтальное положительное направление).
Математика это:
A = (5,1) B = (1,0)
AB = | A || B | cos (угол) -> angle = arccos((|A||B|)/(AB))
Точечный продукт, проверьте геометрическое определение
Редактировать:
Другой вариант - использовать формулу кросс-произведения:
| AxB | = | A || B | sin (угол) -> angle = arcsin((|A||B|)/(|AxB|))
Это даст вам угол, который вам нужен.
Есть более простой способ получить полный 360 градусов. То, что вы ищете, это Math.atan2
:
deg = Math.atan2(obj.velocity.y,obj.velocity.x)*180/Math.PI;