Рассчитать угол (градиент) от вектора с осью X - PullRequest
2 голосов
/ 21 марта 2012

У меня есть две точки в катезианской 2D-системе, обе дают мне начальную и конечную точку вектора.Теперь мне нужен угол между новым вектором и осью X.

Я знаю, что градиент = (y2-y1) / (x2-x1), и я знаю, что угол = arctan (градиент).

Но я не знаю, работает ли это для каждого случая (направления) вектора.Когда мне нужно добавить 180 градусов или что-то в этом роде.

Может ли кто-нибудь предоставить мне какой-нибудь c / java-подобный код или подсказки для всех случаев.

Спасибо и наилучшими пожеланиями

Ответы [ 2 ]

6 голосов
/ 22 марта 2012

Вы можете использовать скалярное произведение (http://en.wikipedia.org/wiki/Dot_product), но, упрощая все это, вы просто берете арктангенс конечной точки вашего вектора, чтобы получить угол между ним и осью x. Функции Атана обычно возвращают в порядке [-pi, pi] или [-180,180], поэтому, если вы хотите убедиться, что он правильно переносится, вам нужно проверить, не отрицательна ли y-компонента вашего вектора. вы можете использовать atan2 вместо atan, и он будет использовать знак каждого компонента, чтобы выяснить знак угла (http://www.cplusplus.com/reference/clibrary/cmath/atan2/).

Например, если у вас есть векторные точки start = <1,2> ​​и end = <- 5, -5>, верните его в начало координат, вычтя начало из конца, что даст вам <-6, -7>. Итак, вы смотрите на этот момент. Угол с осью x равен atan2 (y, x), atan2 (-7, -6), что составляет -130,6.

double x = -6;
double y = -7;

fprintf(stderr,"angle is %.2f\n",atan2(y,x)*180/3.14159);

угол -130.60

0 голосов
/ 28 декабря 2012

Итак, чтобы подвести итог, когда у вас есть двумерный вектор xy и вам нужно найти 0 \ 360 градусов относительно положительной оси X, вы делаете это:

const float RAD2DEG = 180.0f / 3.14159f;

float x = -4.0f;
float y =  3.2f;

// atan2 receives first Y second X
double angle = atan2(y, x) * RAD2DEG;
if (angle < 0) angle += 360.0f;
...