14

可能重复:
如何计算一组循环数据的平均值?

我有两个角度,a=20 度和 b=350 度。这两个角度的平均值是 185 度。但是,如果我们考虑最大角度为 360 度并允许环绕,我们可以看到 5 度是更接近的平均值。

在计算平均值时,我很难想出一个很好的公式来处理这个问题。有人有任何提示吗?

还是我在这里开枪打自己的脚?这在数学中被认为是“坏习惯”吗?

4

3 回答 3

1

如果您看一下角圆,您会看到有 2 个相反的“角度”对应于您的“平均”。

所以 185° 和 5° 都是正确的。

但是你提到了更接近的平均值。所以在这种情况下,您可以选择更接近的角度。

通常,角度的“平均值”涉及逆时针方向。如果您切换两个角度(或者如果您使用顺时针方向),“平均值”是不一样的。

例如,使用a=20°and b=350°,您正在寻找逆时针方向a之后和之前的角度,这就是答案。如果您正在寻找逆时针方向前后(或逆时针方向前后)的角度,就是答案。b 185°abab

这篇文章的答案是正确的做法。

所以解决方案的伪代码是

if (a+180)mod 360 == b then
  return (a+b)/2 mod 360 and ((a+b)/2 mod 360) + 180 (they are both the solution, so you may choose one depending if you prefer counterclockwise or clockwise direction)
else
  return arctan(  (sin(a)+sin(b)) / (cos(a)+cos(b) )
于 2009-07-21T12:41:27.097 回答
-2

只需取正常平均值,然后取模 180。在您的示例中,这给出了 5 度,正如预期的那样。

于 2009-07-21T12:39:30.590 回答
-2

试试这个(C# 中的示例):

    static void Main(string[] args)
    {
        Console.WriteLine(GetAngleAverage(0,0));
        Console.WriteLine(GetAngleAverage(269, 271));
        Console.WriteLine(GetAngleAverage(350, 20));
        Console.WriteLine(GetAngleAverage(361, 361));
    }

    static int GetAngleAverage(int a, int b)
    {
        a = a % 360;
        b = b % 360;

        int sum = a + b;
        if (sum > 360 && sum < 540)
        {
            sum = sum % 180;
        }
        return sum / 2;
    }

我认为它有效,输出是

0
270
5
1
于 2009-07-21T12:39:32.307 回答