【问题标题】:Mean angle calculation平均角度计算
【发布时间】:2017-09-18 23:56:19
【问题描述】:

我有一组角度 A,每个 a 在 A = [0, 360) 中。 现在我想计算平均角度 A。

我在rosettacode.org找到了解决方案:

public static void main(String[] args) {
    printAverageAngle(350.0, 10.0);
    printAverageAngle(0.0, 180);
    printAverageAngle(0.0, 180.0, 180.0);
    printAverageAngle(0.0, 0.0, 180.0);
    printAverageAngle(0.0, 0.0, 180.0, 180.0;
}

private static void printAverageAngle(double... sample) {
    double meanAngle = getMeanAngle(sample);
    System.out.printf("The mean angle of %s is %s%n", Arrays.toString(sample), meanAngle);
}

public static double getMeanAngle(double... anglesDeg) {
    double x = 0.0;
    double y = 0.0;

    for (double angleD : anglesDeg) {
        double angleR = Math.toRadians(angleD);
        x += Math.cos(angleR);
        y += Math.sin(angleR);
    }
    double avgR = Math.atan2(y / anglesDeg.length, x / anglesDeg.length);
    return Math.toDegrees(avgR);
}

但是有一些不需要的解决方案。

[350.0, 10.0] 的平均角度为 -1.614809932057922E-15 // 好

[0.0, 180.0] 的平均角度为 90.0 // 好

[0.0, 180.0, 180.0] 的平均角度是 180.0 // 不好

[0.0, 0.0, 180.0] 的平均角度是 7.016709298534877E-15 // 不好

[0.0, 0.0, 180.0, 180.0] 的平均角度为 90.0 // 好

在我看来,[0.0, 180.0, 180.0] 的平均角度应该是 120,而 [0.0, 0.0, 180.0] 的平均角度应该是 60。

有没有人可以处理这些特殊情况的方法?或者有什么解决办法?

谢谢

【问题讨论】:

标签: java math mean angle


【解决方案1】:

一种方法是修改寻找均值的迭代方法,即在 C 中:

Mean = 0.0
Count = 0;
for ( i=0; i<N; ++i)
{  count += 1;
   diff = X[i]-mean;
   Mean = Mean + diff/count;
}

使用适合角度的差和和运算。在 C 中,角度为角度,这是数学库中的余数函数:

Mean = 0.0
Count = 0;
for ( i=0; i<N; ++i)
{  count += 1;
   diff = remainder(X[i]-Mean, 360.0);
   Mean = remainder( Mean + diff/count, 360.0);
}

请注意,这里的余数()与模数(fmod)不同。来自“人剩余”

remainder() 函数计算 x 除以 y 的余数。返回值是 x-ny,其中 n 是值 x / y,四舍五入到最接近的整数。如果 x-ny 的绝对值为 0.5,则选择 n 为偶数。

请注意“四舍五入到最接近的整数”这一点。所以我们有,例如,

remainder( 30.0 - 10.0, 360.0) = 20
remainder( 350.0 - 10.0, 360.0) = -20

等等。 如果您的语言不提供这样的功能,则需要您自己实现,很抱歉我不懂 Java,所以我对此的建议将毫无用处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2020-09-26
    相关资源
    最近更新 更多