两个带环绕的角度的平均值

16
可能重复:如何计算一组圆形数据的平均值? 我有两个角度,a = 20度和b = 350度。 这两个角度的平均值为185度。 但是,如果我们考虑最大角度为360度并允许环绕,那么可以看出5度更接近平均值。
我很难想出一个好的公式来处理在计算平均值时的包装问题。有人有任何提示吗?
或者我是在自寻死路吗? 在数学上,这被认为是“不好的做法”吗?

1
重复:https://dev59.com/3nRB5IYBdhLWcg3w26t3 - Rafał Dowgird
确实非常类似于我的问题,奇怪的是我找不到它。 - Mizipzor
3个回答

1

如果你看一下角度圆,你会发现有两个相反的“角度”对应于你的“平均值”。

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

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

通常,角度的“平均值”涉及逆时针方向。如果你交换两个角度(或者使用顺时针方向),那么“平均值”就不同了。

例如,对于a=20°b=350°,你要找到在逆时针方向上在a之后且在b之前的角度,答案是185°。如果你要找到在逆时针方向上在a之前且在b之后的角度(或者在逆时针方向上在a之后且在b之前的角度),答案是

这篇帖子的答案是正确的做法。

因此,解决方案的伪代码为

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) )

是的,这就是我要找的更接近平均值。 - Mizipzor
使用 a=180 和 b=270,我得到的数学计算结果为:math:atan((math:sin(180)+math:sin(270))/(math:cos(180)+math:cos(270)))=-1.1946710584651132。这个结果与预期不符。 - quantumpotato
我已经测试过了,结果是正确的。但不幸的是,我们必须使用所有这些三角函数。 - Tim Cooper
仅针对两个角度,计算最小差值: d = ((b-a+180) mod 360) - 180 ,然后将差的一半加入到 a 中:avg = (a+d/2) mod 360 - Jellby

-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

我认为你想要移除if()块内的"return"语句。GetAngleAverage(350,20)应该是5,而不是10。 - Adam Liss
"sum > 360" 这一行应该改为 "sum >= 360"。否则,350和10的平均角度将会是180度,这不是你想要的结果。 - manimino
3
根据这种方法,190和190的平均值也是10。所以我认为这种方法不可行。 - manimino
我同意,这种方法不起作用。请点踩。 - Tim Cooper

-4

只需取普通平均数,然后对180取模即可。在你的示例中,这将得到5度,与预期相符。


Stecy的回答指出要取模360,我在尝试了几次后似乎有效。在哪些情况下360会失败而180会成功呢? - Mizipzor
将两个数的平均值(a+b)/2 取模 180,与先将两数相加取模 360 再除以 2 完全相同。两者等效。 - malach
5
无法运作。例如:角度1 = 280,角度2 = 10,它们的平均值为325。你的公式得到的答案是145。 - lenooh
1
不完全正确。从角平分线的角度来看,你可以通过一个简单的图表看到这两个答案是等价的。 - PaulJWilliams
2
我点了踩因为这个公式不起作用。这个问题看似简单,实际上却很棘手。 - Tim Cooper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接