I have a set of angles A with every a in A = [0, 360). Now I want to calculate the mean angle A.
I found a solution on rosettacode.org:
public static void main(String[] args) {
printAverageAngle(350.0, 10.0);
printAverageAngle(0.0, 180);
printAverageAngle(0.0, 180.0, 180.0);
printAverageAngle(0.0, 0.0, 180.0);
printAverageAngle(0.0, 0.0, 180.0, 180.0;
}
private static void printAverageAngle(double... sample) {
double meanAngle = getMeanAngle(sample);
System.out.printf("The mean angle of %s is %s%n", Arrays.toString(sample), meanAngle);
}
public static double getMeanAngle(double... anglesDeg) {
double x = 0.0;
double y = 0.0;
for (double angleD : anglesDeg) {
double angleR = Math.toRadians(angleD);
x += Math.cos(angleR);
y += Math.sin(angleR);
}
double avgR = Math.atan2(y / anglesDeg.length, x / anglesDeg.length);
return Math.toDegrees(avgR);
}
But there are some unwanted solutions.
The mean angle of [350.0, 10.0] is -1.614809932057922E-15 // good
The mean angle of [0.0, 180.0] is 90.0 // good
The mean angle of [0.0, 180.0, 180.0] is 180.0 // bad
The mean angle of [0.0, 0.0, 180.0] is 7.016709298534877E-15 // bad
The mean angle of [0.0, 0.0, 180.0, 180.0] is 90.0 // good
In my opinion the mean angle of [0.0, 180.0, 180.0] should be 120 and of [0.0, 0.0, 180.0] it should be 60.
Has anyone a method that works with these special cases? Or an idea to fix it?
Thanks