Мне нужно было запустить File-> Invalidate Caches / Restart ..., чтобы удалить остатки оригинального пакета
Попробуйте это (пример на 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
Просто возьмите нормальное среднее значение и затем возьмите его по модулю 180. В вашем примере это дает 5 градусов, как и ожидалось.
если вы посмотрите на угловой круг, вы увидите, что есть 2 противоположных «угла», которые соответствуют вашему «среднему».
Итак, 185 ° и 5 ° равны правильно.
Но вы упомянули более близкое среднее . Так что в этом случае вы можете выбрать более близкий угол.
Обычно «среднее» значение углов относится к направлению против часовой стрелки. «Среднее» не то же самое, если вы переключите два угла (или если вы используете направление по часовой стрелке).
Например, при a = 20 °
и b = 350 °
, вы ищете угол, который следует за a
и перед b
в направлении против часовой стрелки , 185 °
- вот ответ. Если вы ищете угол перед a
и после b
в направлении против часовой стрелки (или после a
и до b
в против часовой стрелки), 5 °
- это ответ.
Ответ этот пост - правильный путь.
Итак, псевдокод для решения 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) )