position function
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,
);
}