28 giugno 2010
“Angolo medio”
E ci risiamo. Di nuovo. Puntualmente. Ancora una volta di fronte all’incubo ricorrente di ogni programmatore di simulazioni che non conosce la trigonometria, perche’ ai suoi tempi (leggasi durante le scuole superiori) non l’ha studiata come avrebbe dovuto fare. Arriva il momento in cui ci sono da fare alcune operazioni con degli angoli ed il programmatore di simulazioni in questione (alias il sottoscritto) si impantana. Miserabilmente. Sempre e comunque. Questa volta ci e’ voluto un pomeriggio intero per capire come fare a calcolare la “media” tra un certo insieme di angoli nel range [-pi;pi].

Il problema non e’ infatti banale come potrebbe sembrare a prima vista, data la complicazione dettata dal wraparound. Se abbiamo per esempio due angoli (assumiamo ancora il range [-pi;pi]) rispettivamente di 179˚ e -179˚, la media aritmetica tra i due valori sarebbe 0˚, quando in realta’ l’angolo risultante dovrebbe essere di 180˚.
Wikipedia propone una paginetta dedicata al problema del calcolo delle medie di quantita’ circolari (circular quantities). Allo stesso modo, girovagando per la rete ho trovato diverse discussioni interessanti sull’argomento, come quelle pubblicate su stackoverflow (qui e poi ancora qui), The Math Forum ed allegro.cc.
La soluzione al problema e’ piu’ semplice di quanto sembri, soprattutto se si hanno a disposizione un computer ed un compilatore C++. In sostanza e’ sufficiente calcolare le sommatorie di seni e coseni di tutti gli angoli presenti nell’insieme su cui si sta lavorando e poi processare questi due totali attraverso la funzione atan2 (che quando si tratta di trigonometria, non so bene per quale motivo, viene sempre fuori). Nell’esempio qui sotto uno snippet del codice che ho scritto per effettuare l’operazione in questione.
I miei colleghi mi hanno anche illuminato sull’esistenza di un toolbox per Matlab chiamato Circular Statistics Toolbox, a cui loro ricorrono solitamente quando si trovano di fronte a problemi di questo genere. Il toolbox e’ gratuito e spulciare il codice contenuto nei suoi vari script puo’ aiutare a chiarirsi le idee.
Infine, a mo di referenza, infilo qui dentro anche il link ad una paginetta web (presumibilmente per bambini, ma la mia preparazione in materia non si discosta molto da quella di un infante) con riassunta la procedure per effettuare conversioni gradi->radianti e viceversa. Utile per tutti coloro, come il sottoscritto, che puntualmente si scordano la sintassi che si puo’ usare direttamente in Google (es. 0.2 degrees in radians).
