0

“参考角”的定义:

区间 [0, 2π) 中的角度 ϑ r对应于该区间外的角度 ϑ,满足条件
sin(ϑ) = sin(ϑ r ) 和 cos(ϑ) = cos(ϑ r )。

例如(为简单起见以度数思考):

参考(390 o ) = 30 o
参考(360 o ) = 0 o
参考(-40 o ) = 320 o
参考(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++ 库例程?

4

2 回答 2

5

这应该这样做。

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
于 2013-04-24T00:30:04.927 回答
2

马特菲利普斯的回答是一个有效且适当的解决方案。
我想添加另一个解决方案,其中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);
    }
}
于 2013-04-24T07:29:04.500 回答