0

我正在尝试根据 SensorManager 获得的传感器数据构建加权平均值。我的问题是,方位角、俯仰角和侧倾角都有一个最大值,当我正好在这一点上时,这些值会从 0 到 359 或向后交换。我的平均值目前只是所有值的加法和除以值的数量。

假设我得到的值是:1, 359, 350, 10 在这种情况下,我希望平均值为 0。如何更改方程式才能获得此功能?

我是否必须检查到 0/360 的“最近”距离并使用该值而不是实际值?

如果我的值在 180 左右,这也会带来一些麻烦:

160, 200 -> 平均值必须是 180,但根据我最近距离的想法,应该是 160,因为 200 + 160 = 360。

我该如何解决这个问题?

编辑:这是我从 SensorManager 获得的值。

  • 0 <= 方位角<360
  • 180<=间距<=180
  • 90<=滚动<=90

Edit2:对不起,我忘了提到我使用的是加权平均值:

double sum = 0;
for int i = 0; i < max; i++
   sum += value[i] * (i / (triangular_number(max))
return sum
4

2 回答 2

1

我找到了一篇关于此的博客文章。

简要总结一下:您必须计算所有 aizmuth 值的正弦平均值和 aizmuth 值的余弦平均值,然后将这些平均值放入 atan2 函数中,然后在必要时通过添加 2 使结果为正* 圆周率。不要忘记将度数值转换为弧度,反之亦然。

于 2013-05-31T23:59:42.380 回答
1

要计算角度的平均值,请使用以下命令

public static final float averageAngle(float[] terms, int totalTerm)
{
    float sumSin = 0;
    float sumCos = 0;
    for (int i = 0; i < totalTerm; i++)
    {
        sumSin += Math.sin(terms[i]);
        sumCos += Math.cos(terms[i]);
    }
    return (float) Math.atan2(sumSin / totalTerm, sumCos / totalTerm);
}
于 2013-06-01T01:31:31.010 回答