[英]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.