// cycleLength e.g. 360 static double cyclicDistance(double a, double b, double cycleLength) { a = mod(a, cycleLength); // a is now between 0 and 360 b = mod(b, cycleLength); // b is now between 0 and 360 // if e.g. a is 40 and b is 50, then distance is 10 // if e.g. a is 10 and b is 350, then distance is 20 // if e.g. b is 10 and a is 350, then distance is 20 double diff = absDiff(a, b); if (a < b) diff = min(diff, a+cycleLength-b); else diff = min(diff, b+cycleLength-a); ret diff; }