Average of two angles with wrap around [duplicate]

拟墨画扇 提交于 2020-01-14 07:13:35

问题


Possible Duplicate:
How do you calculate the average of a set of angles?

I have two angles, a=20 degrees and b=350 degrees. The average of those two angles are 185 degrees. However, if we consider that the maximum angle is 360 degrees and allows for wrap around, one could see that 5 degrees is a closer average.

I'm having troubles coming up with a good formula to handle that wrap around when calculating average. Anyone got any hints?

Or am I shooting myself in the foot here? Is this considered "bad practice" in math?


回答1:


Just take a normal average and then take it mod 180. In your example this gives 5 degrees, as expected.




回答2:


if you have a look at the angular circle, you will see that there are 2 opposite "angles" that corresponds to your "average".

So both 185° and 5° are correct.

But you mentionned the closer average. So in that case, you may choose the angle that is closer.

Usually, the "average" of angles concerns the counterclockwise direction. The "average" is not the same if you switch your two angles (or if you use the clockwise direction).

For example, with a=20° and b=350°, you are looking for the angle that comes after a and before b in the counterclockwise direction, 185° is the answer. If you are looking for the angle that comes before a and after b in the counterclockwise direction (or after a and before b in the counterclock wise direction), is the answer.

The answer of this post is the right way to do.

So the pseudo-code for the solution is

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



回答3:


Try this (example in 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;
    }

I think it works, the output is

0
270
5
1


来源:https://stackoverflow.com/questions/1158909/average-of-two-angles-with-wrap-around

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!