astronomy-bundle
Version:
Bundle for astronomical calculations such as position of moon, sun and planets, sunrise, sunset or solar eclipses. Most of the calculations are based on Jean Meeus 'Astronomical Algorithms' book and the VSOP87 theory.
154 lines (153 loc) • 8.99 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getRhoCosLat = exports.getRhoSinLat = exports.getEquatorialParallax = exports.eclipticJ20002eclipticDate = exports.earthEclipticSpherical2sunEclipticSpherical = exports.rectangularGeocentric2rectangularHeliocentric = exports.rectangularHeliocentric2rectangularGeocentric = exports.equatorialSpherical2eclipticSpherical = exports.eclipticSpherical2equatorialSpherical = exports.equatorialSpherical2topocentricHorizontalByLocalHourAngle = exports.equatorialSpherical2topocentricHorizontal = exports.equatorialSpherical2topocentricSpherical = exports.spherical2rectangular = exports.rectangular2spherical = void 0;
const calculations_1 = require("../../earth/calculations");
const dimensions_1 = require("../../earth/constants/dimensions");
const timeCalc_1 = require("../../time/calculations/timeCalc");
const angleCalc_1 = require("../../utils/angleCalc");
const precessionCalc_1 = require("./precessionCalc");
function rectangular2spherical(coords) {
const { x, y, z } = coords;
const lonRad = Math.atan2(y, x);
const lon = (0, angleCalc_1.normalizeAngle)((0, angleCalc_1.rad2deg)(lonRad));
const latRad = Math.atan(z / Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2)));
const lat = (0, angleCalc_1.rad2deg)(latRad);
const radiusVector = Math.sqrt(Math.pow(x, 2) + Math.pow(y, 2) + Math.pow(z, 2));
return { lon, lat, radiusVector };
}
exports.rectangular2spherical = rectangular2spherical;
function spherical2rectangular(coords) {
const { lon, lat, radiusVector } = coords;
const lonRad = (0, angleCalc_1.deg2rad)(lon);
const latRad = (0, angleCalc_1.deg2rad)(lat);
const x = radiusVector * Math.cos(latRad) * Math.cos(lonRad);
const y = radiusVector * Math.cos(latRad) * Math.sin(lonRad);
const z = radiusVector * Math.sin(latRad);
return { x, y, z };
}
exports.spherical2rectangular = spherical2rectangular;
function equatorialSpherical2topocentricSpherical(coords, location, T) {
const { rightAscension, declination, radiusVector } = coords;
let { lat, lon, elevation } = location;
const dRad = (0, angleCalc_1.deg2rad)(declination);
elevation = elevation || 0.0;
const rhoSinLat = getRhoSinLat(lat, elevation);
const rhoCosLat = getRhoCosLat(lat, elevation);
const pi = getEquatorialParallax(radiusVector);
const piRad = (0, angleCalc_1.deg2rad)(pi);
const LAST = (0, timeCalc_1.getLocalApparentSiderealTime)(T, lon);
const H = (0, timeCalc_1.getLocalHourAngle)(T, lon, rightAscension);
const HRad = (0, angleCalc_1.deg2rad)(H);
const A = Math.cos(dRad) * Math.sin(HRad);
const B = Math.cos(dRad) * Math.cos(HRad) - rhoCosLat * Math.sin(piRad);
const C = Math.sin(dRad) - rhoSinLat * Math.sin(piRad);
const q = Math.sqrt(A * A + B * B + C * C);
const HTopo = (0, angleCalc_1.rad2deg)(Math.atan2(A, B));
const dTopoRad = Math.asin(C / q);
return {
rightAscension: (0, angleCalc_1.normalizeAngle)(LAST - HTopo),
declination: (0, angleCalc_1.rad2deg)(dTopoRad),
radiusVector: q * radiusVector,
};
}
exports.equatorialSpherical2topocentricSpherical = equatorialSpherical2topocentricSpherical;
function equatorialSpherical2topocentricHorizontal(coords, location, T) {
const { rightAscension, declination } = coords;
const { lat, lon } = location;
const topoCoords = equatorialSpherical2topocentricSpherical(coords, location, T);
const H = (0, timeCalc_1.getLocalHourAngle)(T, lon, rightAscension);
return equatorialSpherical2topocentricHorizontalByLocalHourAngle(H, declination, lat, topoCoords.radiusVector);
}
exports.equatorialSpherical2topocentricHorizontal = equatorialSpherical2topocentricHorizontal;
function equatorialSpherical2topocentricHorizontalByLocalHourAngle(localHourAngle, declination, lat, radiusVector = 0) {
const HRad = (0, angleCalc_1.deg2rad)(localHourAngle);
const dRad = (0, angleCalc_1.deg2rad)(declination);
const latRad = (0, angleCalc_1.deg2rad)(lat);
const ARad = Math.atan2(Math.sin(HRad), Math.cos(HRad) * Math.sin(latRad) - Math.tan(dRad) * Math.cos(latRad));
const hRad = Math.asin(Math.sin(latRad) * Math.sin(dRad) + Math.cos(latRad) * Math.cos(dRad) * Math.cos(HRad));
return {
azimuth: (0, angleCalc_1.normalizeAngle)((0, angleCalc_1.rad2deg)(ARad) + 180),
altitude: (0, angleCalc_1.rad2deg)(hRad),
radiusVector: radiusVector,
};
}
exports.equatorialSpherical2topocentricHorizontalByLocalHourAngle = equatorialSpherical2topocentricHorizontalByLocalHourAngle;
function eclipticSpherical2equatorialSpherical(coords, T, normalize = true) {
const { lon, lat, radiusVector } = coords;
const eps = calculations_1.earthCalc.getTrueObliquityOfEcliptic(T);
const epsRad = (0, angleCalc_1.deg2rad)(eps);
const lonRad = (0, angleCalc_1.deg2rad)(lon);
const latRad = (0, angleCalc_1.deg2rad)(lat);
const n = Math.sin(lonRad) * Math.cos(epsRad) - Math.sin(latRad) / Math.cos(latRad) * Math.sin(epsRad);
const d = Math.cos(lonRad);
const rightAscensionRad = Math.atan2(n, d);
const rightAscension = normalize ? (0, angleCalc_1.normalizeAngle)((0, angleCalc_1.rad2deg)(rightAscensionRad)) : (0, angleCalc_1.rad2deg)(rightAscensionRad);
const declinationRad = Math.asin(Math.sin(latRad) * Math.cos(epsRad) + Math.cos(latRad) * Math.sin(epsRad) * Math.sin(lonRad));
const declination = (0, angleCalc_1.rad2deg)(declinationRad);
return { rightAscension, declination, radiusVector };
}
exports.eclipticSpherical2equatorialSpherical = eclipticSpherical2equatorialSpherical;
function equatorialSpherical2eclipticSpherical(coords, T) {
const { rightAscension, declination, radiusVector } = coords;
const eps = calculations_1.earthCalc.getTrueObliquityOfEcliptic(T);
const epsRad = (0, angleCalc_1.deg2rad)(eps);
const rightAscensionRad = (0, angleCalc_1.deg2rad)(rightAscension);
const declinationRad = (0, angleCalc_1.deg2rad)(declination);
const n = Math.sin(rightAscensionRad) * Math.cos(epsRad) + Math.tan(declinationRad) * Math.sin(epsRad);
const d = Math.cos(rightAscensionRad);
const lonRad = Math.atan2(n, d);
const lon = (0, angleCalc_1.normalizeAngle)((0, angleCalc_1.rad2deg)(lonRad));
const latRad = Math.asin(Math.sin(declinationRad) * Math.cos(epsRad)
- Math.cos(declinationRad) * Math.sin(epsRad) * Math.sin(rightAscensionRad));
const lat = (0, angleCalc_1.rad2deg)(latRad);
return { lon, lat, radiusVector };
}
exports.equatorialSpherical2eclipticSpherical = equatorialSpherical2eclipticSpherical;
function rectangularHeliocentric2rectangularGeocentric(heliocentricCoords, heliocentricCoordsEarth) {
return {
x: heliocentricCoords.x - heliocentricCoordsEarth.x,
y: heliocentricCoords.y - heliocentricCoordsEarth.y,
z: heliocentricCoords.z - heliocentricCoordsEarth.z,
};
}
exports.rectangularHeliocentric2rectangularGeocentric = rectangularHeliocentric2rectangularGeocentric;
function rectangularGeocentric2rectangularHeliocentric(geocentricCoords, heliocentricCoordsEarth) {
return {
x: geocentricCoords.x + heliocentricCoordsEarth.x,
y: geocentricCoords.y + heliocentricCoordsEarth.y,
z: geocentricCoords.z + heliocentricCoordsEarth.z,
};
}
exports.rectangularGeocentric2rectangularHeliocentric = rectangularGeocentric2rectangularHeliocentric;
function earthEclipticSpherical2sunEclipticSpherical(coordsEarth) {
const { lon, lat, radiusVector } = coordsEarth;
return {
lon: (0, angleCalc_1.normalizeAngle)(lon + 180),
lat: -1 * lat,
radiusVector: radiusVector,
};
}
exports.earthEclipticSpherical2sunEclipticSpherical = earthEclipticSpherical2sunEclipticSpherical;
function eclipticJ20002eclipticDate(lon, lat, radiusVector, T) {
const jd = (0, timeCalc_1.julianCenturiesJ20002julianDay)(T);
return (0, precessionCalc_1.correctPrecessionForEclipticCoordinates)({ lon, lat, radiusVector }, jd);
}
exports.eclipticJ20002eclipticDate = eclipticJ20002eclipticDate;
function getEquatorialParallax(d) {
const angle = (0, angleCalc_1.deg2rad)((0, angleCalc_1.sec2deg)(8.794));
const piRad = Math.asin(Math.sin(angle) / d);
return (0, angleCalc_1.rad2deg)(piRad);
}
exports.getEquatorialParallax = getEquatorialParallax;
function getRhoSinLat(lat, elevation) {
const latRad = (0, angleCalc_1.deg2rad)(lat);
const uRad = Math.atan(dimensions_1.EARTH_AXIS_RATIO * Math.tan(latRad));
return dimensions_1.EARTH_AXIS_RATIO * Math.sin(uRad) + elevation / dimensions_1.EARTH_RADIUS * Math.sin(latRad);
}
exports.getRhoSinLat = getRhoSinLat;
function getRhoCosLat(lat, elevation) {
const latRad = (0, angleCalc_1.deg2rad)(lat);
const uRad = Math.atan(dimensions_1.EARTH_AXIS_RATIO * Math.tan(latRad));
return Math.cos(uRad) + elevation / dimensions_1.EARTH_RADIUS * Math.cos(latRad);
}
exports.getRhoCosLat = getRhoCosLat;