2013-04-24 135 views
0

定義:算法尋找基準角「基準角度」的

的角度θř在區間[0,2π)對應於角度θ這個區間之外,滿足條件
sin(θ)= sin(θ r)和cos(θ)= cos(θ r)。

例如(以度爲簡單起見思考):

REF(390 Õ)= 30 ö
REF(360 Õ)= 0 ö
ref(-40 o)= 320 o
ref(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

您正在以度數爲先,但您的代碼是弧度。如果你堅持學位,你只需要一個%360,如果弧度你可以計算pi的倍數,所以如果你真的想浮動,所以有%2 * pi或fmod。 – sashkello 2013-04-24 00:30:15

回答

3

這應該這樣做。

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 
0

馬特·菲利普斯的回答是一個有效和妥善的解決辦法。
我想添加另一個明確實現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); 
    } 
}