Скажите, что у меня есть два 2D вектора, один для текущей позиции объектов и один для этого возражает предыдущему положению. Как я могу разработать угловое направление перемещения?
Это изображение могло бы помочь понять то, что я после:
Вектор направления движения будет разностью двух векторов положения,
d = (x1, y1) - (x, y) = (x1 - x, y1 - y)
Теперь, когда вы спрашиваете угол направления, это зависит от того, в каком направлении вы хотите измерить угол. Против оси x? Пойдите с ответом Раду. Против произвольного вектора? См. Ответ Джастжеффа.
Редактировать: Чтобы получить угол относительно оси Y:
tan (theta) = (x1 -x)/(y1 - y)
тангенс угла - это отношение координаты x вектора разности к координате y вектора разности.
Итак
theta = arctan[(x1 - x)/(y1 - y)]
Где арктангенс означает арктангенс. Не путать с обратной величиной тангенса, как это делают многие люди, поскольку оба они часто обозначают tan ^ -1. И убедитесь, что вы знаете, в градусах вы или в радианах.
Все еще не уверен, что вы подразумеваете под матрицами вращения, но это простой случай получения азимута из вектора направления.
Сложный ответ:
Обычно вы должны упаковать несколько функций преобразования / служебных функций с вашими 2D-векторами: одну для преобразования из X, Y (картезианские) в Theta, R (полярные координаты). Вам также следует поддерживать базовые векторные операции, такие как сложение, вычитание и скалярное произведение. В этом случае ваш ответ будет следующим:
double azimuth = (P2 - P1).ToPolarCoordinate().Azimuth;
Где ToPolarCoordinate () и ToCarhtesianCoordinate () - две взаимные функции, переключающие один тип вектора на Другая.
Самый простой:
double azimuth = acos ((x2-x1)/sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));
//then do a quadrant resolution based on the +/- sign of (y2-y1) and (x2-x1)
if (x2-x1)>0 {
if (y2-y1)<0 { azimuth = Pi-azimuth; } //quadrant 2
} else
{ if (y2-y1)> 0 { azimuth = 2*Pi-azimuth;} //quadrant 4
else { azimuth = Pi + azimuth;} //quadrant 3
}
Если вы используете C (или другой язык, использующий тот же набор функций), то вы, вероятно, ищете atan2 ()
функция. Из вашей диаграммы:
double theta = atan2(x1-x, y1-y);
Этот угол будет от вертикальной оси, как вы отметили, и будет измеряться в радианах (собственная угловая единица Бога).