寻找参考角的算法

时间:2013-04-24 00:27:31

标签: c++ algorithm trigonometry angle

“参考角度”的定义:

  

对应于该间隔外的角度θ的区间[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 ++库例程一样?

2 个答案:

答案 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);
    }
}