2009-07-21 3 views
8

Возможный дубликат:
How do you calculate the average of a set of angles?Среднее из двух углов с обернуть вокруг

У меня есть два угла, а = 20 градусов, В = 350 градусов. Среднее значение этих двух углов составляет 185 градусов. Однако, если учесть, что максимальный угол составляет 360 градусов и позволяет обернуть вокруг, можно видеть, что 5 градусов является более близким.

У меня возникли проблемы с хорошей формулой для обработки этого обертывания при вычислении среднего значения. У кого-нибудь есть подсказки?

Или я стреляю себе в ногу здесь? Это считается «плохой практикой» в математике?

+0

Дубликат: http://stackoverflow.com/questions/491738/how-do-you-calculate-the-average-of-a-set -отклонения –

+0

Его действительно очень похоже на мой вопрос, странно, что я не мог его найти. – Mizipzor

ответ

2

Просто возьмите нормальное среднее значение, а затем возьмите его mod 180. В вашем примере это дает 5 градусов, как и ожидалось.

+0

Stecys отвечает на состояние, чтобы принять модель 360, которая, кажется, работает в нескольких попытках, в которых я пробовал. Где 360 терпит неудачу и 180 успешно? – Mizipzor

+0

Принимая среднее значение (a + b)/2, а затем mod 180 точно такое же, как в первом случае (a + b) mod 360, а затем делится на 2. Оба эквивалентны. –

+2

Это не работает. Пример: angle1 = 280, angle2 = 10, их среднее значение 325. Ваша формула дает 145. – lenooh

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 
+0

Я думаю, вы хотите удалить «возврат» внутри блока if() , GetAngleAverage (350,20) должно быть 5, а не 10. –

+0

Право. Исправлено. – weiqure

+0

Строка «сумма> 360» должна быть «sum> = 360». В противном случае средний угол 350 и 10 выйдет на 180, что вам не нужно. – naroom

0

, если вы посмотрите на угловой круг, вы увидите, что есть 2 противоположных «угла», что соответствует вашему «среднему».

Таким образом, как 185 °, так и 5 ° являются правильными.

Но вы указали по средней цене. Поэтому в этом случае вы можете выбрать угол, который ближе.

Обычно «средний» угол относится к направлению против часовой стрелки. «Средний» - это не то же самое, если вы переключаете два угла (или, если используете направление по часовой стрелке).

Например, с a=20° и b=350°, вы ищете угол, который приходит после a и перед bв направлении против часовой стрелки, 185° ответ. Если вы ищете угол, который предшествует a, а после b в направлении против часовой стрелки (или после a и до b в направлении против часовой стрелки), - ответ.

Ответ this post - правильный путь.

Таким образом, псевдо-код раствора

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

Да, это ближе к среднему, которое я ищу. – Mizipzor

+0

с a из 180 и b из 270. Я получаю математику: atan ((math: sin (180) + math: sin (270))/(math: cos (180) + math: cos (270))). -1.1946710584651132 Не ожидается – quantumpotato