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

263 lines
8.6 KiB
JavaScript

'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var base = require('./base.cjs');
var coord = require('./coord.cjs');
var nutation = require('./nutation.cjs');
/**
* @copyright 2013 Sonia Keys
* @copyright 2016 commenthol
* @license MIT
* @module solar
*/
/**
* True returns true geometric longitude and anomaly of the sun referenced to the mean equinox of date.
*
* @param {Number} T - number of Julian centuries since J2000. See base.J2000Century.
* @returns {Object}
* {Number} lon = true geometric longitude, ☉, in radians
* {Number} ano = true anomaly in radians
*/
function trueLongitude (T) {
// (25.2) p. 163
const L0 = base["default"].horner(T, 280.46646, 36000.76983, 0.0003032) *
Math.PI / 180;
const m = meanAnomaly(T);
const C = (base["default"].horner(T, 1.914602, -0.004817, -0.000014) *
Math.sin(m) +
(0.019993 - 0.000101 * T) * Math.sin(2 * m) +
0.000289 * Math.sin(3 * m)) * Math.PI / 180;
const lon = base["default"].pmod(L0 + C, 2 * Math.PI);
const ano = base["default"].pmod(m + C, 2 * Math.PI);
return { lon, ano }
}
/**
* meanAnomaly returns the mean anomaly of Earth at the given T.
*
* @param {Number} T - number of Julian centuries since J2000. See base.J2000Century.
* @returns {Number} Result is in radians and is not normalized to the range 0..2π.
*/
function meanAnomaly (T) {
// (25.3) p. 163
return base["default"].horner(T, 357.52911, 35999.05029, -0.0001537) * Math.PI / 180
}
/**
* eccentricity returns eccentricity of the Earth's orbit around the sun.
*
* @param {Number} T - number of Julian centuries since J2000. See base.J2000Century.
* @returns {Number} eccentricity of the Earth's orbit around the sun.
*/
function eccentricity (T) {
// (25.4) p. 163
return base["default"].horner(T, 0.016708634, -0.000042037, -0.0000001267)
}
/**
* Radius returns the Sun-Earth distance in AU.
*
* @param {Number} T - number of Julian centuries since J2000. See base.J2000Century.
* @returns {Number} Sun-Earth distance in AU
*/
function radius (T) {
const {lon, ano} = trueLongitude(T); // eslint-disable-line
const e = eccentricity(T);
// (25.5) p. 164
return 1.000001018 * (1 - e * e) / (1 + e * Math.cos(ano))
}
/**
* ApparentLongitude returns apparent longitude of the Sun referenced to the true equinox of date.
* Result includes correction for nutation and aberration. Unit is radians.
*
* @param {Number} T - number of Julian centuries since J2000. See base.J2000Century.
* @returns {Number} apparent longitude of the Sun referenced to the true equinox of date.
*/
function apparentLongitude (T) {
const Ω = node(T);
const {lon, ano} = trueLongitude(T); // eslint-disable-line
return lon - 0.00569 * Math.PI / 180 - 0.00478 * Math.PI / 180 * Math.sin(Ω)
}
/**
* @private
*/
function node (T) {
return 125.04 * Math.PI / 180 - 1934.136 * Math.PI / 180 * T
}
/**
* true2000 returns true geometric longitude and anomaly of the sun referenced to equinox J2000.
* Results are accurate to .01 degree for years 1900 to 2100.
*
* @param {Number} T - number of Julian centuries since J2000. See base.J2000Century.
* @returns {Object}
* {Number} lon - true geometric longitude, ☉, in radians
* {Number} ano - true anomaly in radians
*/
function true2000 (T) {
let { lon, ano } = trueLongitude(T);
lon -= 0.01397 * Math.PI / 180 * T * 100;
return { lon, ano }
}
/**
* trueEquatorial returns the true geometric position of the Sun as equatorial coordinates.
*
* @param {Number} jde - Julian ephemeris day
* @returns {Coord}
* {Number} ra - right ascension in radians
* {Number} dec - declination in radians
*/
function trueEquatorial (jde) {
const {lon, ano} = trueLongitude(base["default"].J2000Century(jde)); // eslint-disable-line
const ε = nutation["default"].meanObliquity(jde);
const [ss, cs] = base["default"].sincos(lon);
const [, ] = base["default"].sincos(ε);
// (25.6, 25.7) p. 165
const ra = Math.atan2( * ss, cs);
const dec = * ss;
return new base["default"].Coord(ra, dec)
}
/**
* apparentEquatorial returns the apparent position of the Sun as equatorial coordinates.
*
* @param {Number} jde - Julian ephemeris day
* @returns {Coord}
* {Number} ra - right ascension in radians
* {Number} dec - declination in radians
*/
function apparentEquatorial (jde) {
const T = base["default"].J2000Century(jde);
const λ = apparentLongitude(T);
const ε = nutation["default"].meanObliquity(jde);
const [, ] = base["default"].sincos(λ);
// (25.8) p. 165
const [, ] = base["default"].sincos(ε + 0.00256 * Math.PI / 180 * Math.cos(node(T)));
const ra = Math.atan2( * , );
const dec = Math.asin( * );
return new base["default"].Coord(ra, dec)
}
/**
* trueVSOP87 returns the true geometric position of the sun as ecliptic coordinates.
*
* Result computed by full VSOP87 theory. Result is at equator and equinox
* of date in the FK5 frame. It does not include nutation or aberration.
*
* @param {Planet} planet
* @param {Number} jde - Julian ephemeris day
* @returns {Object}
* {Number} lon - ecliptic longitude in radians
* {Number} lat - ecliptic latitude in radians
* {Number} range - range in AU
*/
function trueVSOP87 (planet, jde) {
let { lon, lat, range } = planet.position(jde);
const s = lon + Math.PI;
// FK5 correction.
const λp = base["default"].horner(base["default"].J2000Century(jde),
s, -1.397 * Math.PI / 180, -0.00031 * Math.PI / 180);
const [sλp, cλp] = base["default"].sincos(λp);
const Δβ = 0.03916 / 3600 * Math.PI / 180 * (cλp - sλp);
// (25.9) p. 166
lon = base["default"].pmod(s - 0.09033 / 3600 * Math.PI / 180, 2 * Math.PI);
lat = Δβ - lat;
return new base["default"].Coord(lon, lat, range)
}
/**
* apparentVSOP87 returns the apparent position of the sun as ecliptic coordinates.
*
* Result computed by VSOP87, at equator and equinox of date in the FK5 frame,
* and includes effects of nutation and aberration.
*
* @param {Planet} planet
* @param {Number} jde - Julian ephemeris day
* @returns {Coord}
* {Number} lon - ecliptic longitude in radians
* {Number} lat - ecliptic latitude in radians
* {Number} range - range in AU
*/
function apparentVSOP87 (planet, jde) {
// note: see duplicated code in ApparentEquatorialVSOP87.
let { lon, lat, range } = trueVSOP87(planet, jde);
const Δψ = nutation["default"].nutation(jde)[0];
const a = aberration(range);
lon = lon + Δψ + a;
return new base["default"].Coord(lon, lat, range)
}
/**
* apparentEquatorialVSOP87 returns the apparent position of the sun as equatorial coordinates.
*
* Result computed by VSOP87, at equator and equinox of date in the FK5 frame,
* and includes effects of nutation and aberration.
*
* @param {Planet} planet
* @param {Number} jde - Julian ephemeris day
* @returns {Coord}
* {Number} ra - right ascension in radians
* {Number} dec - declination in radians
* {Number} range - range in AU
*/
function apparentEquatorialVSOP87 (planet, jde) {
// note: duplicate code from ApparentVSOP87 so we can keep Δε.
// see also duplicate code in time.E().
const { lon, lat, range } = trueVSOP87(planet, jde);
const [Δψ, Δε] = nutation["default"].nutation(jde);
const a = aberration(range);
const λ = lon + Δψ + a;
const ε = nutation["default"].meanObliquity(jde) + Δε;
const { ra, dec } = new coord["default"].Ecliptic(λ, lat).toEquatorial(ε);
return new base.Coord(ra, dec, range)
}
/**
* Low precision formula. The high precision formula is not implemented
* because the low precision formula already gives position results to the
* accuracy given on p. 165. The high precision formula represents lots
* of typing with associated chance of typos, and no way to test the result.
* @param {Number} range
* @returns {Number} aberation
*/
function aberration (range) {
// (25.10) p. 167
return -20.4898 / 3600 * Math.PI / 180 / range
}
var solar = {
trueLongitude,
true: trueLongitude, // BACKWARDS-COMPATIBILITY
meanAnomaly,
eccentricity,
radius,
apparentLongitude,
true2000,
trueEquatorial,
apparentEquatorial,
trueVSOP87,
apparentVSOP87,
apparentEquatorialVSOP87,
aberration
};
exports.aberration = aberration;
exports.apparentEquatorial = apparentEquatorial;
exports.apparentEquatorialVSOP87 = apparentEquatorialVSOP87;
exports.apparentLongitude = apparentLongitude;
exports.apparentVSOP87 = apparentVSOP87;
exports["default"] = solar;
exports.eccentricity = eccentricity;
exports.meanAnomaly = meanAnomaly;
exports.radius = radius;
exports.true2000 = true2000;
exports.trueEquatorial = trueEquatorial;
exports.trueLongitude = trueLongitude;
exports.trueVSOP87 = trueVSOP87;