Newsgroup: it.comp.programmare
Titolo: Calcolare la media tra n angoli

Ciao a tutti, non so se questo è il gruppo giusto al quale porre
questa domanda, tuttavia il mio quesito è il seguente: dati n angoli
(0..360 gradi), compresi in un settore inferiore a 180 gradi, come
posso calcolare l'angolo medio in modo veloce?
Qualcuno di voi ha qualche suggerimento?


  ma vuoi sapere l'algoritmo oppure vuoi tradurre l'algoritmo in un 
linguaggio di programmazione?


Li sommi tutti e dividi per n.
E.

 Qualcuno di voi ha qualche suggerimento?
Se fossimo stati su it.hobby.enigmi, avrei risposto 180/n sui due piedi.
Qui pero' mi riservo di meditarci su, perche' una risposta del genere 
richiede dimostrazione per poter essere considerata valida.

 E.
non è così banale:
se hai 355 e 5 gradi ti verrebbe 360/2=180 invece di 0 gradi, ossia
avresti lo stesso risultato di 175 e 185.

avresti lo stesso risultato di 175 e 185.
E non è affatto detto che il valore corretto sia 0°, che non sia corretto
invece proprio 180°, o che non siano corretti entrambi.
Sono d'accordo che il problema non è banale, ma quello che lo rende non
banale è l'indeterminatezza della domanda.
Ciao.

 avresti lo stesso risultato di 175 e 185.
Dipende da quello che devi fare, dovresti spiegare la situazione. Se hai 
  0 e 180 gradi quale dovrebbe essere la media?
Probabilmente quello che vuoi fare č la cosa seguente:
calcola la media x dei coseni di tutti gli angoli
e la media y dei seni di tutti gli angoli
Se x==y==0 il risultato č indeterminato (come nel caso 0, 180).
Altrimenti restituisci atan2(x,y).
E.

   0 e 180 gradi quale dovrebbe essere la media?
supponi di avere un insieme di una trentina di bearing (vedili come
angoli di un punto all'orizzonte rispetto al nord) misurati da un
aereo che sta volando eseguendo una traiettoria circolare e ne vuoi
avere un valore medio.
Come fare?

 posso calcolare l'angolo medio in modo veloce?
Prima calcolalo in modo lento e poi vedi se č sufficientemente veloce.
Modo 1: per ogni angolo calcoli il coseno e il seno. Fai la media di coseni 
e seni. Calcoli l'arcotangente della media dei seni fratto la media dei 
coseni.
Modo 2: Se gli angoli fossero tutti tra 0 e 180 io farei somma degli angoli 
diviso il numero. Siccome sono "compresi in un settore inferiore a 180 
gradi", immagino che sia sufficiente ruotarli fino ad averli nel range 
[0,180]. Quindi trovi il minimo. Calcoli l'angolo minimo rispetto al minimo 
(cioč vedi se conviene esprimere gli angoli come valori positivi o negativi 
rispetto al minimo). Fai la media e ci risommi il minimo. Questa versione 
potrebbe essere piů veloce se si lavora in aritmetica intera. Sull'altra si 
possono sempre usare delle tabelle precalcolate.
-- 
Costantino Grana 

 Come fare?
Utilizza il Modo 2 che ti ha suggerito Costantino Grana.
E.

<< elycoimax >>

Bisogna scoprire se il settore cade sopra l'angolo zero, oppure no. Se no,
basta fare la semplice media. Se si, bisogna ruotare il settore finchè
l'angolo zero resta all'esterno:
aMin = min(listaAngoli)
aMax = max(listaAngoli)
if (aMax - aMin) < 180
	return media(listaAngoli)
else
	for a in listaAngoli
		a -= aMin
		if a <= 0 : a += 360
	M = media(listaAngoli) + aMin
	if M >= 360 : M -= 360
	return M
-- 
This is my useless sign.

 	return M
Si può fare anche senza rotazione:
aMin = min(listaAngoli)
aMax = max(listaAngoli)
if (aMax - aMin) < 180
	return media(listaAngoli)
else
	for a in listaAngoli
		if a < 180 : a += 360
	M = media(listaAngoli)



Questo è esattamente il sistema che avevo utilizzato io. L'unica
variante è che gli angoli sono ordinati temporalmente ed ogniuno ha un
peso diverso a seconda dell'anzianità (ma questo è un dettaglio
secondario).
Grazie a tutti della collaborazione.

 Questo č esattamente il sistema che avevo utilizzato io. 
Sarebbe stato piů corretto se avessi postato tu il codice e avessi 
chiesto: c'é un metodo migliore per fare questo...
E.


Questo è vero se avessi già trovato il sistema per farlo ;-)
Grazie di nuovo a tutti!