簡體   English   中英

查找參考角的算法

[英]Algorithm for finding reference angle

“參考角”的定義:

間隔[0,2π)中的角度ϑ r對應於該間隔之外的角度ϑ,滿足條件
sin(ϑ)= sin(ϑ r )和cos(ϑ)= cos(ϑ r )。

例如(為簡單起見,以度為單位思考):

參考(390 o )= 30 o
ref(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 ++庫例程?

這應該做。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM