localLunarEclipse function

LocalLunarEclipse localLunarEclipse(
  1. Ephemeris ephemeris,
  2. LunarEclipse eclipse, {
  3. required double latitude,
  4. required double longitude,
  5. double height = 0,
  6. double? deltaTSeconds,
})

The Moon's position at each contact of lunar eclipse eclipse for a place at geodetic latitude and longitude (degrees, east positive) and height above sea level in metres. deltaTSeconds overrides the ΔT model.

Implementation

LocalLunarEclipse localLunarEclipse(
  Ephemeris ephemeris,
  LunarEclipse eclipse, {
  required double latitude,
  required double longitude,
  double height = 0,
  double? deltaTSeconds,
}) {
  final observer = Observer(
    latitude: latitude,
    longitude: longitude,
    height: height,
  );

  LunarEclipseContact contact(double t) {
    final moon = horizontalPosition(
      ephemeris,
      Naif.moon,
      observer,
      t,
      deltaTSeconds: deltaTSeconds,
    );
    final semidiameter = math.asin(moonRadius / moon.distance) / _degree;
    return LunarEclipseContact(
      jdTT: t,
      altitude: moon.altitude,
      azimuth: moon.azimuth,
      visible: moon.altitude > starHorizonAltitude - semidiameter,
    );
  }

  LunarEclipseContact? optional(double? t) => t == null ? null : contact(t);
  return LocalLunarEclipse(
    eclipse: eclipse,
    penumbralBegin: contact(eclipse.penumbralBegin),
    partialBegin: optional(eclipse.partialBegin),
    totalBegin: optional(eclipse.totalBegin),
    maximum: contact(eclipse.jdTT),
    totalEnd: optional(eclipse.totalEnd),
    partialEnd: optional(eclipse.partialEnd),
    penumbralEnd: contact(eclipse.penumbralEnd),
  );
}