有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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不是一个相对较大的数字,所以我不认为有一个没有循环的纯加法/减法解决方案。我不知道手动循环与%相比可能有多大。)

是否有一个经过良好测试的优化库函数可以使用,或者有一个更好的算法,或者这是最好的吗


共 (2) 个答案

  1. # 1 楼答案

    Apache commons有一个:

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

    normalize an angle between -π and +π

    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月)从最新的commons math 4中删除。x代码库。如果在此之后使用的是一个版本,则需要使用commons-numbers(一旦发布)——当前:

    a = PlaneAngleRadians.normalizeBetweenMinusPiAndPi(a);
    

    或者

    a = PlaneAngleRadians.normalize(a, 0.0);
    
  2. # 2 楼答案

    只有一种100%万无一失的方法:

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

    其他一切都是人们试图变得太聪明和失败