Можно, кстати, поиграть в теорему косинусов для нахождения 

, а потом найти угол как 

где 

 — полярные координаты 

, а 

 должно быть известно ещё от применения теоремы косинусов. Всего получается 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) };
Длину нашел без проблем, а вот угол - в некоторых случая совпадает с верным ответом, но в целом отличается. Т.е. моя теорема синусов работает неправильно. А ваш вариант нахождения угла, почему-то тоже не возвращает нужный результат.