2009-07-21 10 views
8

Eventuali duplicati:
How do you calculate the average of a set of angles?media di due angoli con l'involucro intorno

Ho due angoli, a = 20 gradi e B = 350 gradi. La media di questi due angoli è di 185 gradi. Tuttavia, se consideriamo che l'angolo massimo è 360 gradi e consente di avvolgere, si potrebbe vedere che 5 gradi è una media più vicina.

Sto avendo problemi a venire con una buona formula per gestire che avvolgono quando si calcola la media. Qualcuno ha qualche suggerimento?

Oppure mi sto sparando ai piedi qui? Questa è considerata una "cattiva pratica" in matematica?

+0

Duplicate: http://stackoverflow.com/questions/491738/how-do-you-calculate-the-average-of-a-set -degli angoli –

+0

È davvero molto simile alla mia domanda, strano che non potrei trovarlo. – Mizipzor

risposta

2

Basta prendere una media normale e quindi portarla mod 180. Nel tuo esempio questo dà 5 gradi, come previsto.

+0

Gli stati di risposta di Stecys accettano mod 360, che sembra funzionare nei pochi tentativi in ​​cui l'ho provato. Dove fallisce 360 ​​e 180 succede? – Mizipzor

+0

Prendendo la media come (a + b)/2 e poi mod 180 è esattamente uguale a prima mod (a + b) mod 360 e quindi dividi per 2. Entrambi sono equivalenti. –

+2

Questo non funziona. Esempio: angle1 = 280, angle2 = 10, la loro media è 325. La tua formula dà 145. – lenooh

2

Prova questo (ad esempio 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; 
    } 

penso che funziona, l'uscita è

0 
270 
5 
1 
+0

Penso che tu voglia rimuovere il "ritorno" all'interno del blocco if() . GetAngleAverage (350,20) dovrebbe essere 5, non 10. –

+0

Giusto. Risolto il problema. – weiqure

+0

La riga "somma> 360" deve essere "somma> = 360". Altrimenti l'angolo medio di 350 e 10 uscirà a 180, che non è quello che vuoi. – naroom

0

se si dispone di uno sguardo al cerchio angolare, si vedrà che ci sono 2 opposti "angoli" che corrispondono alla tua "media".

Quindi entrambi i 185 ° e 5 ° sono corretti.

Ma lei ha menzionato la media più vicina . In tal caso, puoi scegliere l'angolo più vicino.

Di solito, la "media" degli angoli riguarda la direzione antioraria. La "media" non è la stessa se si cambiano i due angoli (o se si utilizza la direzione in senso orario).

Ad esempio, con a=20° e b=350°, si sta cercando per l'angolo che viene dopo e prima abin senso antiorario, 185° è la risposta. Se stai cercando l'angolo che precede lo a e dopo b in senso antiorario (o dopo lo a e prima dello b nella direzione in senso antiorario), è la risposta.

La risposta di this post è la soluzione giusta.

Così la pseudo-codice per la soluzione è

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ì, è la media più vicina che sto cercando. – Mizipzor

+0

con a di 180 eb di 270 ,, ottengo la matematica: atan ((matematica: sin (180) + matematica: sin (270))/(matematica: cos (180) + matematica: cos (270))). -1.1946710584651132 Non previsto – quantumpotato