Вычислить направляющий угол от двух векторов?

Скажите, что у меня есть два 2D вектора, один для текущей позиции объектов и один для этого возражает предыдущему положению. Как я могу разработать угловое направление перемещения?

Это изображение могло бы помочь понять то, что я после:

(изображение) http://files.me.com/james.ingham/crcvmy

12
задан Mateen Ulhaq 17 July 2015 в 07:44
поделиться

3 ответа

Вектор направления движения будет разностью двух векторов положения,

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. И убедитесь, что вы знаете, в градусах вы или в радианах.

10
ответ дан 2 December 2019 в 05:54
поделиться

Все еще не уверен, что вы подразумеваете под матрицами вращения, но это простой случай получения азимута из вектора направления.

Сложный ответ:

Обычно вы должны упаковать несколько функций преобразования / служебных функций с вашими 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
 }
2
ответ дан 2 December 2019 в 05:54
поделиться

Если вы используете C (или другой язык, использующий тот же набор функций), то вы, вероятно, ищете atan2 () функция. Из вашей диаграммы:

double theta = atan2(x1-x, y1-y);

Этот угол будет от вертикальной оси, как вы отметили, и будет измеряться в радианах (собственная угловая единица Бога).

9
ответ дан 2 December 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: