2014-06-15 6 views
8

각도를 +/- π로 정규화하는 라이브러리 함수 또는 잘 알려진 Java의 효율적인 효율적인 방법이 있습니까? 두 각도를 추가 할 때?Java에서 +/- π 라디안 각도로 표준화하는 표준 방법

내가 (this answer 기준) 지금 가지고 무엇을 기본적으로 아래의 코드는 ...

private static final double TWO_PI = 2 * Math.PI; 

double normalize(double theta) { 
    double normalized = theta % TWO_PI; 
    normalized = (normalized + TWO_PI) % TWO_PI; 
    return normalized <= Math.PI ? normalized : normalized - TWO_PI; 
} 

...하지만 조금 복잡한 것 같습니다과 성능이 많다는 나는 흥분 아니에요 모듈러스 연산자. (사실 theta은 비교적 큰 숫자가 아니므로 루핑을하지 않는 순수한 덧셈/뺄셈 해법은 없다고 생각합니다. 실제로 손으로 구부린 루프가 %)

내가 사용할 수있는 잘 테스트 된 최적화 된 라이브러리 기능이 있습니까? 아니면 더 나은 알고리즘입니까, 아니면 얻은만큼 좋을까요?

+0

가장 가까운 90도 (반원) 또는 가장 가까운 180도 (전체 파이)로 반올림하려하십니까? – Kon

+0

@Kon 180도/풀 파이. –

+0

[-179도에서 180도 사이의 각도를 유지하는 쉬운 방법] 가능한 중복 (http://stackoverflow.com/questions/2320986/easy-way-to-keeping-angles-between-179-and-180-degrees) –

답변

12

아파치 평민이 하나 있습니다

http://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/org/apache/commons/math3/util/MathUtils.html#normalizeAngle(double, double)

는 -π와 + π

a = MathUtils.normalizeAngle(a, 0.0);

그리고 소스 코드를 찾고, 당신은 재생할 수 사이의 각도를 정상화 그것으로 이것 (그들은 그들 자신의 FastMath.floor를 사용합니다. 그러나 당신이 전없이 그것을하고 싶다면 영원한 라이브러리) :

theta - TWO_PI * Math.floor((theta + Math.PI)/TWO_PI) 

소스는 여기에 있습니다 : 미래에서 독자 https://github.com/apache/commons-math/blob/53ec46ba272e23c0c96ada42f26f4e70e96f3115/src/main/java/org/apache/commons/math4/util/MathUtils.java#L107


참고 :이 방법은 단지가 2017 (6 월) 최신 공유지 - 수학 4.x의에서 been removed 코드베이스. 이 후 버전을 사용하는 경우, 당신은 (출시 된 후에는) 대신 commons-numbers를 사용하는 것이 좋습니다 - 현재 :

a = PlaneAngleRadians.normalizeBetweenMinusPiAndPi(a); 

또는

a = PlaneAngleRadians.normalize(a, 0.0); 
4

는 하나 100 % 절대 안전한 방법이 있습니다 :

public static double normalizeAngle(double angle) { 
    return Math.atan2(Math.sin(angle), Math.cos(angle)); 
} 

다른 모든 것은 너무 똑똑하고 실패하는 사람들입니다.

+3

이 방법은 아마도 더 정확할 것입니다. ('MathUtils'와는 달리 반 폐쇄 된 범위를 제공합니다), 약 40 배 더 느립니다 (중간 크기 ~ 15 초 MBP에서 190ns,'MathUtils'에서 4.9ns) 이는 일부 애플리케이션에서 더 중요 할 수 있습니다. –

+0

동의합니다, atan2가 느려질 수 있습니다. 하지만 NaN 및 ± Infinity를 사용하는 경우를 처리합니다. – cohadar

+0

MathUtils도이를 처리합니다. atan2와 마찬가지로 3 개 모두에 대해 NaN을 반환합니다. –