2013-04-24 2 views
0

정의 찾는 :알고리즘 기준 각도를 "기준 각도"의

각도 구간 [0, R θ를 2π) 조건이 간격의 각도 θ 외측에 대응 만족
sin (θ) = sin (θ r) 및 cos (θ) = cos (θr)이다.
O를
REF ( O 360 ) = 0 O

REF ( O 390 ) = 30 :

예를 들어 (간략화를 위해도에서 생각) ref (-40 o) = 320 o
ref (540 기준 각을 찾기위한 예제 코드가

오 O) = 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의 배수로 계산할 수 있습니다. 따라서 정말로 float을 원하면 % 2 * pi 또는 fmod가됩니다. – sashkello

답변

3

이렇게해야합니다.

double FindReferenceAngle(double Angle) 
{ 
    const double TWOPI = 2.0 * 3.1415926535897932384626433832795; 
    return fmod(Angle, TWOPI); 
} 

아마 파이의 정의를 세계화 어딘가에 헤더에 넣어, 혹은이 좋은 생각 일 것입니다 비록 :

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