144 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						||
 | 
						||
Object.defineProperty(exports, '__esModule', { value: true });
 | 
						||
 | 
						||
var base = require('./base.cjs');
 | 
						||
 | 
						||
/**
 | 
						||
 * @copyright 2013 Sonia Keys
 | 
						||
 * @copyright 2016 commenthol
 | 
						||
 * @license MIT
 | 
						||
 * @module moonillum
 | 
						||
 */
 | 
						||
 | 
						||
const D2R = Math.PI / 180;
 | 
						||
 | 
						||
/**
 | 
						||
 * phaseAngleEquatorial computes the phase angle of the Moon given equatorial coordinates.
 | 
						||
 *
 | 
						||
 * @param {Coord} cMoon - geocentric right ascension,  declination and distance to the Moon
 | 
						||
 * @param {Coord} cSun - coordinates and distance of the Sun
 | 
						||
 * @returns {number} phase angle of the Moon in radians
 | 
						||
 */
 | 
						||
function phaseAngleEquatorial (cMoon, cSun) {
 | 
						||
  return pa(cMoon.range, cSun.range, cosEq(cMoon.ra, cMoon.dec, cSun.ra, cSun.dec))
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * cos elongation from equatorial coordinates
 | 
						||
 * @private
 | 
						||
 */
 | 
						||
function cosEq (α, δ, α0, δ0) {
 | 
						||
  const [sδ, cδ] = base["default"].sincos(δ);
 | 
						||
  const [sδ0, cδ0] = base["default"].sincos(δ0);
 | 
						||
  return sδ0 * sδ + cδ0 * cδ * Math.cos(α0 - α)
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * phase angle from cos elongation and distances
 | 
						||
 * @private
 | 
						||
 * @param {number} Δ
 | 
						||
 * @param {number} R
 | 
						||
 * @param {number} cψ
 | 
						||
 * @returns {number}
 | 
						||
 */
 | 
						||
function pa (Δ, R, cψ) {
 | 
						||
  const sψ = Math.sin(Math.acos(cψ));
 | 
						||
  let i = Math.atan(R * sψ / (Δ - R * cψ));
 | 
						||
  if (i < 0) {
 | 
						||
    i += Math.PI;
 | 
						||
  }
 | 
						||
  return i
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * phaseAngleEquatorial2 computes the phase angle of the Moon given equatorial coordinates.
 | 
						||
 *
 | 
						||
 * Less accurate than phaseAngleEquatorial.
 | 
						||
 *
 | 
						||
 * Arguments α, δ are geocentric right ascension and declination of the Moon;
 | 
						||
 * α0, δ0  are coordinates of the Sun.  Angles must be in radians.
 | 
						||
 *
 | 
						||
 * @param {Coord} cMoon - eocentric right ascension and declination of the Moon
 | 
						||
 * @param {Coord} cSun - coordinates of the Sun
 | 
						||
 * @returns {number} phase angle of the Moon in radians
 | 
						||
 */
 | 
						||
function phaseAngleEquatorial2 (cMoon, cSun) {
 | 
						||
  return Math.acos(-cosEq(cMoon.ra, cMoon.dec, cSun.ra, cSun.dec))
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * phaseAngleEcliptic computes the phase angle of the Moon given ecliptic coordinates.
 | 
						||
 *
 | 
						||
 * Distances must be in the same units as each other.
 | 
						||
 *
 | 
						||
 * @param {Coord} cMoon - geocentric longitude, latitude and distance to the Moon
 | 
						||
 * @param {Coord} cSun -  longitude and distance to the Sun
 | 
						||
 * @returns {number} phase angle of the Moon in radians
 | 
						||
 */
 | 
						||
function phaseAngleEcliptic (cMoon, cSun) {
 | 
						||
  return pa(cMoon.range, cSun.range, cosEcl(cMoon.lon, cMoon.lat, cSun.lon))
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * cos elongation from ecliptic coordinates
 | 
						||
 * @private
 | 
						||
 */
 | 
						||
function cosEcl (λ, β, λ0) { // (λ, β, λ0 float64)  float64
 | 
						||
  return Math.cos(β) * Math.cos(λ - λ0)
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * phaseAngleEcliptic2 computes the phase angle of the Moon given ecliptic coordinates.
 | 
						||
 *
 | 
						||
 * Less accurate than phaseAngleEcliptic.
 | 
						||
 *
 | 
						||
 * Angles must be in radians.
 | 
						||
 *
 | 
						||
 * @param {Coord} cMoon - geocentric longitude, latitude of the Moon
 | 
						||
 * @param {Coord} cSun -  longitude of the Sun
 | 
						||
 * @returns {number} phase angle of the Moon in radians
 | 
						||
 */
 | 
						||
function phaseAngleEcliptic2 (cMoon, cSun) {
 | 
						||
  return Math.acos(-cosEcl(cMoon.lon, cMoon.lat, cSun.lon))
 | 
						||
}
 | 
						||
 | 
						||
/**
 | 
						||
 * phaseAngle3 computes the phase angle of the Moon given a julian day.
 | 
						||
 *
 | 
						||
 * Less accurate than phaseAngle functions taking coordinates.
 | 
						||
 *
 | 
						||
 * Result in radians.
 | 
						||
 */
 | 
						||
function phaseAngle3 (jde) { // (jde float64)  float64
 | 
						||
  const T = base["default"].J2000Century(jde);
 | 
						||
  const D = base["default"].horner(T, 297.8501921 * D2R, 445267.1114034 * D2R,
 | 
						||
    -0.0018819 * D2R, D2R / 545868, -D2R / 113065000);
 | 
						||
  const m = base["default"].horner(T, 357.5291092 * D2R, 35999.0502909 * D2R,
 | 
						||
    -0.0001536 * D2R, D2R / 24490000);
 | 
						||
  const m_ = base["default"].horner(T, 134.9633964 * D2R, 477198.8675055 * D2R,
 | 
						||
    0.0087414 * D2R, D2R / 69699, -D2R / 14712000);
 | 
						||
  return Math.PI - base["default"].pmod(D, 2 * Math.PI) +
 | 
						||
    -6.289 * D2R * Math.sin(m_) +
 | 
						||
    2.1 * D2R * Math.sin(m) +
 | 
						||
    -1.274 * D2R * Math.sin(2 * D - m_) +
 | 
						||
    -0.658 * D2R * Math.sin(2 * D) +
 | 
						||
    -0.214 * D2R * Math.sin(2 * m_) +
 | 
						||
    -0.11 * D2R * Math.sin(D)
 | 
						||
}
 | 
						||
 | 
						||
var moonillum = {
 | 
						||
  phaseAngleEquatorial,
 | 
						||
  phaseAngleEquatorial2,
 | 
						||
  phaseAngleEcliptic,
 | 
						||
  phaseAngleEcliptic2,
 | 
						||
  phaseAngle3
 | 
						||
};
 | 
						||
 | 
						||
exports["default"] = moonillum;
 | 
						||
exports.phaseAngle3 = phaseAngle3;
 | 
						||
exports.phaseAngleEcliptic = phaseAngleEcliptic;
 | 
						||
exports.phaseAngleEcliptic2 = phaseAngleEcliptic2;
 | 
						||
exports.phaseAngleEquatorial = phaseAngleEquatorial;
 | 
						||
exports.phaseAngleEquatorial2 = phaseAngleEquatorial2;
 |