Алгоритм поиска опорного угла

Определение «опорного угла»:

Угол ϑр в интервале [0, 2π), соответствующем углу ϑ вне этого интервала, удовлетворяющем условиям
грех (ϑ) = грех (ϑр) и cos (ϑ) = cos (ϑр).

Например (мысли в градусах для простоты):

исх (390о) = 30о
исх (360о) = 0о
исх (-40о) = 320о
исх (540о) = 180о

Пример кода для нахождения опорного угла является:

double FindReferenceAngle(double Angle)
{
const double TWOPI = 2.0 * 3.1415926535897932384626433832795;
while(true)
{
if (Angle >= TWOPI)
{
Angle -= TWOPI;
}
else if (Angle < 0)
{
Angle += TWOPI;
}
else
{
return Angle;
}
}
}

Однако я не думаю, что этот код является оптимальным. Например, если пользователь вызывает его с очень большим значением угла (например, FindReferenceAngle(1e10)) это займет довольно много времени в цикле while.

Есть ли другой, более эффективный алгоритм поиска угла отсчета, например, встроенная стандартная процедура библиотеки C ++?

0

Решение

Это должно сделать это.

double FindReferenceAngle(double Angle)
{
const double TWOPI = 2.0 * 3.1415926535897932384626433832795;
return fmod(Angle, TWOPI);
}

Хотя, вероятно, было бы неплохо глобализировать определение числа pi и поместить его в заголовок где-нибудь, или, возможно, так:

#define _USE_MATH_DEFINES
#ifdef M_PI
#define TWOPI 2*M_PI
#else
#define TWOPI 2.0*3.1415926535897932384626433832795
#endif
4

Другие решения

Ответ Мэтта Филлипса — правильное и правильное решение.
Я хочу добавить другое решение, в котором операция fmod Функция явно реализована.

double FindReferenceAngle(double Angle)
{
const double TWOPI = 2.0 * 3.1415926535897932384626433832795;
if (Angle >= 0)
{
return Angle - TWOPI * floor(Angle / TWOPI);
}
else
{
return Angle - TWOPI * ceil(Angle / TWOPI);
}
}
1