Я закодировал этот код здесь:
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-сегмент...
Спасибо за совет.
Вы можете получить полный диапазон (-Pi.. Pi для большинства математических библиотек), используя как скалярный продукт, так и кросс-продукт:
radian = Math.atan2(v1.x*v2.y-v1.y*v2.x, v1.x*v2.x+v1.y*v2.y)
Вы используете точечный продукт двух векторов для вычисления угла между ними, но поскольку точка-произведение коммутативна 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.