可能重复:如何计算一组圆形数据的平均值?
我有两个角度,a = 20度和b = 350度。 这两个角度的平均值为185度。 但是,如果我们考虑最大角度为360度并允许环绕,那么可以看出5度更接近平均值。
我很难想出一个好的公式来处理在计算平均值时的包装问题。有人有任何提示吗?
或者我是在自寻死路吗? 在数学上,这被认为是“不好的做法”吗?
我很难想出一个好的公式来处理在计算平均值时的包装问题。有人有任何提示吗?
或者我是在自寻死路吗? 在数学上,这被认为是“不好的做法”吗?
如果你看一下角度圆,你会发现有两个相反的“角度”对应于你的“平均值”。
所以185°和5°都是正确的。
但是你提到了“更接近的平均值”。那么在这种情况下,你可以选择更接近的角度。
通常,角度的“平均值”涉及逆时针方向。如果你交换两个角度(或者使用顺时针方向),那么“平均值”就不同了。
例如,对于a=20°
和b=350°
,你要找到在逆时针方向上在a
之后且在b
之前的角度,答案是185°
。如果你要找到在逆时针方向上在a
之前且在b
之后的角度(或者在逆时针方向上在a
之后且在b
之前的角度),答案是5°
。
这篇帖子的答案是正确的做法。
因此,解决方案的伪代码为
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) )
d = ((b-a+180) mod 360) - 180
,然后将差的一半加入到 a
中:avg = (a+d/2) mod 360
。 - Jellby 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
只需取普通平均数,然后对180取模即可。在你的示例中,这将得到5度,与预期相符。