“参考角度”的定义:
对应于该间隔外的角度θ的区间[0,2π]中的角度θ r ,满足条件
sin(θ)= sin(θ r )和cos(θ)= cos(θ r )。
例如(为了简单而考虑学位):
ref(390 o )= 30 o
ref(360 o )= 0 o
ref(-40 o )= 320 o
ref(540 o )= 180 o
查找参考角度的示例代码是:
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 :(得分:4)
这应该这样做。
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
答案 1 :(得分:1)
Matt Phillips的答案是一个有效和正确的解决方案
我想添加另一个解决方案,明确实现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);
}
}