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.
72 lines (71 loc) • 3.33 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTopocentricHorizontalCoordinates = exports.getObscuration = exports.getMoonSunRatio = exports.getMagnitude = exports.getMaximumEclipse = exports.getEclipseType = void 0;
const coordinateCalc_1 = require("../../coordinates/calculations/coordinateCalc");
const solarEclipseTypes_1 = require("../constants/solarEclipseTypes");
const circumstancesCalc_1 = require("./circumstancesCalc");
function getEclipseType(circumstances) {
const { l2Derived } = circumstances;
const maximumEclipse = getMaximumEclipse(circumstances);
const magnitude = getMagnitude(circumstances);
if (magnitude <= 0.0) {
return solarEclipseTypes_1.SolarEclipseType.None;
}
if (maximumEclipse < l2Derived || maximumEclipse < -1 * l2Derived) {
if (l2Derived < 0.0) {
return solarEclipseTypes_1.SolarEclipseType.Total;
}
return solarEclipseTypes_1.SolarEclipseType.Annular;
}
return solarEclipseTypes_1.SolarEclipseType.Partial;
}
exports.getEclipseType = getEclipseType;
function getMaximumEclipse(circumstances) {
const { u, v } = circumstances;
return Math.sqrt(Math.pow(u, 2) + Math.pow(v, 2));
}
exports.getMaximumEclipse = getMaximumEclipse;
function getMagnitude(circumstances) {
const { l1Derived, l2Derived } = circumstances;
const maximumEclipse = getMaximumEclipse(circumstances);
return (l1Derived - maximumEclipse) / (l1Derived + l2Derived);
}
exports.getMagnitude = getMagnitude;
function getMoonSunRatio(circumstances) {
const { l1Derived, l2Derived } = circumstances;
return (l1Derived - l2Derived) / (l1Derived + l2Derived);
}
exports.getMoonSunRatio = getMoonSunRatio;
function getObscuration(circumstances) {
const { l1Derived, l2Derived } = circumstances;
const eclipseType = getEclipseType(circumstances);
const maximumEclipse = getMaximumEclipse(circumstances);
const magnitude = getMagnitude(circumstances);
const moonSunRatio = getMoonSunRatio(circumstances);
if (magnitude <= 0.0) {
return 0.0;
}
if (magnitude >= 1.0) {
return 1.0;
}
if (eclipseType === solarEclipseTypes_1.SolarEclipseType.Annular) {
return Math.pow(moonSunRatio, 2);
}
const cNumerator = Math.pow(l1Derived, 2) + Math.pow(l2Derived, 2) - 2 * Math.pow(maximumEclipse, 2);
const cDenominator = Math.pow(l1Derived, 2) - Math.pow(l2Derived, 2);
const c = Math.acos(cNumerator / cDenominator);
const bNumerator = (l1Derived * l2Derived + Math.pow(maximumEclipse, 2)) / maximumEclipse;
const bDenominator = l1Derived + l2Derived;
const b = Math.acos(bNumerator / bDenominator);
const a = Math.PI - b - c;
const result = Math.pow(moonSunRatio, 2) * a + b - moonSunRatio * Math.sin(c);
return result / Math.PI;
}
exports.getObscuration = getObscuration;
function getTopocentricHorizontalCoordinates(besselianElements, circumstances, location) {
const { t, h } = circumstances;
const { d } = (0, circumstancesCalc_1.getTimeCircumstances)(besselianElements, t);
const { lat } = location;
return (0, coordinateCalc_1.equatorialSpherical2topocentricHorizontalByLocalHourAngle)(h, d, lat);
}
exports.getTopocentricHorizontalCoordinates = getTopocentricHorizontalCoordinates;