django-vue3-admin-web/node_modules/astronomia/lib/elp.cjs
2025-10-20 21:21:14 +08:00

156 lines
4.2 KiB
JavaScript

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var base = require('./base.cjs');
/**
* @copyright 2020 mdmunir
* @copyright 2020 commenthol
* @license MIT
* @module elp
*/
const SEC2RAD = 1 / 3600 * Math.PI / 180;
function sum (T, series) {
const coeffs = [];
Object.keys(series).forEach((x) => {
coeffs[x] = 0.0;
let y = series[x].length - 1;
for (y; y >= 0; y--) {
// A, t0, t1, t2, t3, t4
const row = series[x][y];
const φ = base["default"].horner(T, row.slice(1));
coeffs[x] += row[0] * Math.sin(φ);
}
});
return base["default"].horner(T, ...coeffs)
}
/**
*
*/
class Moon {
/**
* ELP representation of a Moon
* @constructs Moon
* @param {object} data - elp data series
* @example
* ```js
* // for use in browser
* import {data} from 'astronomia.js'
* const moon = new elp.Moon(data.elpMppDe)
* ```
*/
constructor (data) {
if (typeof data !== 'object') throw new TypeError('need Elp data')
this.series = data;
}
_calcLBR (T) {
const L = base["default"].horner(T, this.series.W1) + sum(T, this.series.L) * SEC2RAD;
const B = sum(T, this.series.B) * SEC2RAD;
const R = sum(T, this.series.R);
return { L: base["default"].pmod(L, 2 * Math.PI), B, R }
}
/**
* Position returns rectangular coordinates referred to the inertial mean ecliptic and equinox of J2000.
* @param {Number} jde - Julian ephemeris day
* @return {object} rectangular coordinates
* {Number} x
* {Number} y
* {Number} z
*/
positionXYZ (jde) {
const T = base["default"].J2000Century(jde);
const { L, B, R } = this._calcLBR(T);
const x = R * Math.cos(L) * Math.cos(B);
const y = R * Math.sin(L) * Math.cos(B);
const z = R * Math.sin(B);
const P = base["default"].horner(T, 0, 0.10180391e-4, 0.47020439e-6, -0.5417367e-9, -0.2507948e-11, 0.463486e-14);
const Q = base["default"].horner(T, 0, -0.113469002e-3, 0.12372674e-6, 0.12654170e-8, -0.1371808e-11, -0.320334e-14);
const sq = Math.sqrt(1 - P * P - Q * Q);
const p11 = 1 - 2 * P * P;
const p12 = 2 * P * Q;
const p13 = 2 * P * sq;
const p21 = 2 * P * Q;
const p22 = 1 - 2 * Q * Q;
const p23 = -2 * Q * sq;
const p31 = -2 * P * sq;
const p32 = 2 * Q * sq;
const p33 = 1 - 2 * P * P - 2 * Q * Q;
const result = {
x: p11 * x + p12 * y + p13 * z,
y: p21 * x + p22 * y + p23 * z,
z: p31 * x + p32 * y + p33 * z
};
return result
}
/**
* Delay effect of light time
*
* @param {Number} jde - Julian ephemeris day
* @returns {Number} Delay time in days
*/
lightTime (jde) {
const T = base["default"].J2000Century(jde);
const R = sum(T, this.series.R);
return base["default"].lightTime(R / base["default"].AU)
}
/**
* Position returns ecliptic position of moon at equinox and ecliptic of date.
*
* @param {Number} jde - the date for which positions are desired.
* @returns {Coord} Results are positions consistent with those elp data,
* that is, at equinox and ecliptic of date.
* {Number} lon - geocentric longitude in radians.
* {Number} lat - geocentric latitude in radians.
* {Number} range - geocentric range in KM.
*/
position (jde) {
const T = base["default"].J2000Century(jde);
const { L, B, R } = this._calcLBR(T);
// precession
const pA = base["default"].horner(T, 0, 5029.0966 - 0.29965, 1.1120, 0.000077, -0.00002353) * SEC2RAD;
return new base.Coord(
base["default"].pmod(L + pA, 2 * Math.PI),
B,
R)
}
}
/**
* Position returns the true geometric position of the moon as ecliptic coordinates.
*
* Result computed by Elp theory. Result is at equator and equinox
* of date in the FK5 frame. It does not include nutation or aberration.
*
* @param {Object} elpData
* @param {Number} jde - Julian ephemeris day
* @returns {Object}
* {Number} lon - ecliptic longitude in radians
* {Number} lat - ecliptic latitude in radians
* {Number} range - range in KM
*/
function position (elpData, jde) {
const moon = new Moon(elpData);
return moon.position(jde)
}
var elp = {
Moon,
position
};
exports.Moon = Moon;
exports["default"] = elp;
exports.position = position;