position function

({double delta, double lat, double lon}) position(
  1. double jde
)

Geocentric position of the Moon.

Results are referenced to the mean equinox of date (no nutation). Returns (lon, lat, delta) where lon/lat are in radians and delta is in km.

Implementation

({double lon, double lat, double delta}) position(double jde) {
  final t = j2000Century(jde);
  final lp = horner(t, [218.3164477 * _p, 481267.88123421 * _p,
      -0.0015786 * _p, _p / 538841, -_p / 65194000]);
  final dmf = _dmf(t);
  final d = dmf[0], m = dmf[1], mp = dmf[2], f = dmf[3];
  final a1 = 119.75 * _p + 131.849 * _p * t;
  final a2 = 53.09 * _p + 479264.29 * _p * t;
  final a3 = 313.45 * _p + 481266.484 * _p * t;
  final e = horner(t, [1.0, -0.002516, -0.0000074]);
  final e2 = e * e;

  var sigmaL = 3958 * math.sin(a1) + 1962 * math.sin(lp - f) + 318 * math.sin(a2);
  var sigmaR = 0.0;
  var sigmaB = -2235 * math.sin(lp) + 382 * math.sin(a3) +
      175 * math.sin(a1 - f) + 175 * math.sin(a1 + f) +
      127 * math.sin(lp - mp) - 115 * math.sin(lp + mp);

  for (var i = 0; i < _ta.length; i++) {
    final r = _ta[i];
    final arg = d * r[0] + m * r[1] + mp * r[2] + f * r[3];
    final sa = math.sin(arg);
    final ca = math.cos(arg);
    final mAbs = r[1].abs();
    if (mAbs == 0) {
      sigmaL += r[4] * sa;
      sigmaR += r[5] * ca;
    } else if (mAbs == 1) {
      sigmaL += r[4] * sa * e;
      sigmaR += r[5] * ca * e;
    } else {
      sigmaL += r[4] * sa * e2;
      sigmaR += r[5] * ca * e2;
    }
  }

  for (var i = 0; i < _tb.length; i++) {
    final r = _tb[i];
    final sb = math.sin(d * r[0] + m * r[1] + mp * r[2] + f * r[3]);
    final mAbs = r[1].abs();
    if (mAbs == 0) {
      sigmaB += r[4] * sb;
    } else if (mAbs == 1) {
      sigmaB += r[4] * sb * e;
    } else {
      sigmaB += r[4] * sb * e2;
    }
  }

  return (
    lon: mod2pi(lp + sigmaL * 1e-6 * _p),
    lat: sigmaB * 1e-6 * _p,
    delta: 385000.56 + sigmaR * 1e-3,
  );
}