public static void Main() >>> { >>> var result = GetAverage(new int[] {357, 2, 359, 356, 4, 2, 355, 22}); //Result : 2 >>> result = GetAverage(new int[] { 180, 182, 175, 178, 183, 185, 177, 172 }); //Result: 44 :-{ >>> } >>> >>> public static double GetAverage(int[] values) >>> { >>> double c = 0; >>> double s = 0; >>> >>> foreach (int i in values) >>> { >>> double r = DegreeToRadian(i); >>> c += Math.Cos(r); >>> s += Math.Sin(r); >>> } >>> >>> double a = Math.Atan2(s, c); >>> >>> return RadianToDegree(a); >>> } >>> >>> public static double DegreeToRadian(double angle) >>> { >>> return Math.PI * angle / 180.0; >>> } >>> >>> public static double RadianToDegree(double angle) >>> { >>> return angle * (180.0 / Math.PI); >>> }>>> More testing......
>> public static int GetAverage(IEnumerable<int> readings) >> { >> double s = 0.0, c = 0.0; >> bool haveData = false; >> >> foreach (int value in readings) >> { >> double rads = DegreeToRadian(value); >> >> s += Math.Sin(rads); >> c += Math.Cos(rads); >> haveData = true; >> } >> >> int result = 0; >> if (haveData) >> { >> double rads; >> >> if (c == 0) >> { >> rads = s >= 0.00 ? Math.PI / 2.0 : -Math.PI / 2.0; >> } >> else >> rads = Math.Atan2(s, c); >> >> result = (int)RadianToDegree(rads); >> >> } >> return result; >> } >> public static double DegreeToRadian(double degrees) >> { >> return Math.PI * Modulo(degrees, 360.00) / 180.0; >> } >> >> public static double RadianToDegree(double rads) >> { >> return Modulo(rads, Math.PI * 2) * (180.0 / Math.PI); >> } >> public static double Modulo(double dividend, double divisor) >> { >> return (dividend % divisor) >> + (Math.Sign(dividend) * Math.Sign(divisor) >= 0 ? 0 : divisor); >> } >>I ended up with this (JScript):
function getAverageAngle(angleArray) { > var c = 0; > var s = 0; > > for (var i = 0; i < angleArray.length; i++) { > var r = degreeToRadian(angleArray[i]); > c += Math.cos(r); > s += Math.sin(r); > } > var a = Math.atan2(s, c); > var result = radianToDegree(a); > if (result < 0) > result = 360 + result; > return result; >} > >function degreeToRadian(angle) { > return Math.PI * angle / 180; >} > >function radianToDegree(angle) { > return angle * (180 / Math.PI); >}Raw and average seem to tally.