Угол в 360 градусов

1

Я закодировал этот код здесь:

     double cosine = (v1.x*v2.x+v1.y*v2.y)/(150*150);               
     double radian = Math.acos(cosine);
     double angle = Math.toDegrees(radian);

V1 и V2 - два вектора, которые являются простыми Точками (s)(), чтобы они были простыми. Теперь я вычисляю. угол между ними и работает хорошо. Но более 180 град. , он возвращается к 179,178... Но я хочу иметь 360 °.

Проблема в том, что, например, radian не будет отрицательным, так что я могу поместить его в if-сегмент...

Спасибо за совет.

  • 1
    Это кажется скорее математической проблемой, чем проблемой кодирования. Как бы вы сделали это с бумагой и карандашом?
  • 0
    да, я думаю, что это тоже математическая проблема. То, как я это запрограммировал, это то, как я это делал на бумаге (я так и научился). Кажется, что линия начала дает мне меньший угол.
Показать ещё 1 комментарий
Теги:
math
angle
circle

2 ответа

1
Лучший ответ

Вы можете получить полный диапазон (-Pi.. Pi для большинства математических библиотек), используя как скалярный продукт, так и кросс-продукт:

radian = Math.atan2(v1.x*v2.y-v1.y*v2.x, v1.x*v2.x+v1.y*v2.y)
  • 0
    Ах я вижу. хорошо, но я все еще должен проверить, <0 или что-то в этом роде?
  • 0
    Нет, atan2 () работает во всех секторах.
Показать ещё 3 комментария
2

Вы используете точечный продукт двух векторов для вычисления угла между ними, но поскольку точка-произведение коммутативна ab = ba поэтому нет способа получить смысл угла, только его величина (поскольку вы "узнал") - acos неоднозначен более чем на 180º.

Вместо этого попробуйте использовать atan2. Это должно быть что-то вроде:

double theta1 = Math.atan2(v1.y, v1.x);
double theta2 = Math.atan2(v2.y, v2.x);
double theta = theta1 - theta2;

Обратите внимание, что atan2 всегда возвращает ответ в -pi... pi, поэтому вам нужно будет добавить pi, чтобы сделать его в диапазоне 0... 2.0 * pi.

  • 0
    Вы не хотите добавлять пи. Вы хотите добавить 2 * пи, если оно меньше 0.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню