2009-07-21 13 views
8

Duplicar posible:
How do you calculate the average of a set of angles?Promedio de dos ángulos con envoltura alrededor

Tengo dos ángulos, a = 20 grados y B = 350 grados. El promedio de esos dos ángulos son 185 grados. Sin embargo, si consideramos que el ángulo máximo es de 360 ​​grados y permite un ajuste, uno podría ver que 5 grados es un promedio más cercano.

Tengo problemas para encontrar una buena fórmula para manejar ese ajuste al calcular el promedio. Alguien tiene alguna pista?

¿O me estoy disparando en el pie aquí? ¿Esto se considera una "mala práctica" en matemáticas?

+0

duplicado: http://stackoverflow.com/questions/491738/how-do-you-calculate-the-average-of-a-set -de-ángulos –

+0

Es de hecho muy similar a mi pregunta, raro que no pude encontrarlo. – Mizipzor

Respuesta

2

Simplemente tome un promedio normal y luego tome el mod 180. En su ejemplo, esto da 5 grados, como se esperaba.

+0

La respuesta de Stecys indica que debe tomar mod 360, lo que parece funcionar en los pocos intentos en los que intenté. ¿Dónde falla 360 y 180 tiene éxito? – Mizipzor

+0

Tomando el promedio como (a + b)/2 y luego mod 180 es exactamente lo mismo que hacer primero (a + b) mod 360 y luego dividir por 2. Ambos son equivalentes. –

+2

Esto no funciona. Ejemplo: angle1 = 280, angle2 = 10, su media es 325. Su fórmula da 145. – lenooh

2

Prueba esto (ejemplo en 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; 
    } 

creo que funciona, la salida es

0 
270 
5 
1 
+0

Creo que desea eliminar el "retorno" dentro del bloque if() . GetAngleAverage (350,20) debe ser 5, no 10. –

+0

Derecha. Solucionado eso. – weiqure

+0

La línea "suma> 360" debe ser "suma> = 360". De lo contrario, el ángulo promedio de 350 y 10 saldrá a 180, que no es lo que desea. – naroom

0

si usted tiene una mirada en el círculo angular, verá que hay 2 "ángulos" opuestos que corresponden a su "promedio".

Por lo tanto, 185 ° y 5 ° son correctos.

Pero usted mencionó el promedio más cercano. Entonces, en ese caso, puedes elegir el ángulo que está más cerca.

Por lo general, el "promedio" de los ángulos se refiere a la dirección antihoraria. El "promedio" no es lo mismo si cambia sus dos ángulos (o si usa la dirección en el sentido de las agujas del reloj).

Por ejemplo, con a=20° y b=350°, que busca el ángulo que se produce después de a y antes de ben el sentido antihorario, 185° es la respuesta. Si está buscando el ángulo que aparece antes de a y después de b en el sentido contrario a las agujas del reloj (o después de a y antes de b en sentido horario), es la respuesta.

La respuesta de this post es la forma correcta de hacerlo.

Así que el pseudo-código para la solución es

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

Sí, es el promedio más cercano que estoy buscando. – Mizipzor

+0

con a de 180 yb de 270 ,, obtengo matemáticas: atan ((matemáticas: sin (180) + matemáticas: sin (270))/(matemáticas: cos (180) + matemáticas: cos (270))). -1.1946710584651132 No esperado – quantumpotato