Java中是否有库函数或众所周知的快速有效方法将角度标准化为+/-π - 例如,当添加两个角度时?
我现在得到的(基于这个答案)基本上是下面的代码......
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;
}
Run Code Online (Sandbox Code Playgroud)
...但它似乎有点复杂和性能方面我对模运算符并不感兴趣.(请注意,我不能保证theta不是一些相对较大的数字,所以我认为没有循环的纯加法/减法解决方案.我实际上并不知道手动循环可能与之比较%. )
是否有一个经过充分测试的优化库函数,我可以使用,或者更好的算法,或者这是否与它一样好?
Cup*_*Tae 16
Apache commons有一个:
归一化-π和+π之间的角度
a = MathUtils.normalizeAngle(a, 0.0);
在查看源代码时,您可以使用它来重现它(它们使用它们自己FastMath.floor但是如果您想在没有外部库的情况下执行它):
theta - TWO_PI * Math.floor((theta + Math.PI) / TWO_PI)
Run Code Online (Sandbox Code Playgroud)
来源在这里:https://github.com/apache/commons-math/blob/53ec46ba272e23c0c96ada42f26f4e70e96f3115/src/main/java/org/apache/commons/math4/util/MathUtils.java#L107
未来读者的注意事项:此方法刚刚(2017年6月)已从最新的commons-math 4.x代码库中删除.如果您在此之后使用的是某个版本,则需要使用commons-numbers(一旦发布) - 目前:
a = PlaneAngleRadians.normalizeBetweenMinusPiAndPi(a);
Run Code Online (Sandbox Code Playgroud)
要么
a = PlaneAngleRadians.normalize(a, 0.0);
Run Code Online (Sandbox Code Playgroud)
只有一种100%万无一失的方式:
public static double normalizeAngle(double angle) {
return Math.atan2(Math.sin(angle), Math.cos(angle));
}
Run Code Online (Sandbox Code Playgroud)
其他一切都是人们试图过于聪明和失败.