smallest function

({double diameter, bool typeI}) smallest(
  1. double ra1,
  2. double dec1,
  3. double ra2,
  4. double dec2,
  5. double ra3,
  6. double dec3,
)

Smallest circle containing three celestial bodies.

All arguments in radians. Returns diameter in radians and whether the solution is Type I (two points on circle, third inside).

Implementation

({double diameter, bool typeI}) smallest(
    double ra1, double dec1,
    double ra2, double dec2,
    double ra3, double dec3) {
  var a = sep(ra1, dec1, ra2, dec2);
  var b = sep(ra2, dec2, ra3, dec3);
  var c = sep(ra3, dec3, ra1, dec1);

  // Sort so a >= b >= c
  if (a < b) { final t = a; a = b; b = t; }
  if (a < c) { final t = a; a = c; c = t; }
  if (b < c) { final t = b; b = c; c = t; }

  if (a >= math.sqrt(b * b + c * c)) {
    return (diameter: a, typeI: true);
  }
  // Type II: all three on circle
  final d = 2 * a * b * c /
      math.sqrt((a + b + c) * (-a + b + c) * (a - b + c) * (a + b - c));
  return (diameter: d, typeI: false);
}