Можно, кстати, поиграть в теорему косинусов для нахождения
, а потом найти угол как
где
— полярные координаты
, а
должно быть известно ещё от применения теоремы косинусов. Всего получается 7 умножений, 5 сложений и 4 вызова функций (если не пользоваться предложенной функцией
hypot, которая может быть примитивной, а также функцией, вычисляющей синус и косинус одного и того же аргумента за раз, если есть в библиотеке языка), тогда как в счёте в лоб получается 6 умножений, 3 сложения и 6 вызовов функций. Этот анализ не особо полон без сравнения точности вычислений — здесь может быть и хуже, не знаю. (UPD: а вообще время выполнения кода надо измерять (и грамотно), конечно. Но если сравнить с декартовым случаем, разница значительная.)
Переделал первую формулу, должно работать.
Код:
double a1 = v1.angle * PI / 180; //перевод из градусов в радианы
double a2 = v2.angle * PI / 180; //перевод из градусов в радианы
double x1 = v1.value * cos(a1); //перевод в декартову систему
double y1 = v1.value * sin(a1); //перевод в декартову систему
double x2 = v2.value * cos(a2); //перевод в декартову систему
double y2 = v2.value * sin(a2); //перевод в декартову систему
double x3 = x1 - x2;
double y3 = y1 - y2;
double angle3 = atan2(y3, x3);
if (angle3 < 0) angle3 += PI;
return{ angle3 / PI * 180, hypot(x3, y3)};
Но меня заинтересовал метод без перевода в декартову систему. И я с этого и начинал, но запнулся на нахождении угла и решил делать иначе. Вот на чем я остановился:
Код:
double a1 = v1.angle * PI / 180; //перевод из градусов в радианы
double a2 = v2.angle * PI / 180; //перевод из градусов в радианы
double z = pow(v1.value, 2) + pow(v2.value, 2) - 2 * v1.value*v2.value*cos(a1 - a2); // --длина(по теореме косинусов)
//double c = atan2(v1.value*cos(a1-a2),v1.value*sin(a1-a2)-v2.value)+a1; -- возвращает угол 45, в то время как для вычитания {0;100} - {180;100} - верно будет 180
double c = asin(sin(a1 - a2) * v2.value / z) +PI; // --угол(по теореме синусов)
if (c < 0) c += PI;
return{ c / PI * 180, sqrt(z) };
Длину нашел без проблем, а вот угол - в некоторых случая совпадает с верным ответом, но в целом отличается. Т.е. моя теорема синусов работает неправильно. А ваш вариант нахождения угла, почему-то тоже не возвращает нужный результат.