可能重复:
如何计算一组循环数据的平均值?
我有两个角度,a=20 度和 b=350 度。这两个角度的平均值是 185 度。但是,如果我们考虑最大角度为 360 度并允许环绕,我们可以看到 5 度是更接近的平均值。
在计算平均值时,我很难想出一个很好的公式来处理这个问题。有人有任何提示吗?
还是我在这里开枪打自己的脚?这在数学中被认为是“坏习惯”吗?
可能重复:
如何计算一组循环数据的平均值?
我有两个角度,a=20 度和 b=350 度。这两个角度的平均值是 185 度。但是,如果我们考虑最大角度为 360 度并允许环绕,我们可以看到 5 度是更接近的平均值。
在计算平均值时,我很难想出一个很好的公式来处理这个问题。有人有任何提示吗?
还是我在这里开枪打自己的脚?这在数学中被认为是“坏习惯”吗?
如果您看一下角圆,您会看到有 2 个相反的“角度”对应于您的“平均”。
所以 185° 和 5° 都是正确的。
但是你提到了更接近的平均值。所以在这种情况下,您可以选择更接近的角度。
通常,角度的“平均值”涉及逆时针方向。如果您切换两个角度(或者如果您使用顺时针方向),“平均值”是不一样的。
例如,使用a=20°
and 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) )
只需取正常平均值,然后取模 180。在您的示例中,这给出了 5 度,正如预期的那样。
试试这个(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