144 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
Object.defineProperty(exports, '__esModule', { value: true });
 | 
						|
 | 
						|
var base = require('./base.cjs');
 | 
						|
var sexagesimal = require('./sexagesimal.cjs');
 | 
						|
var coord = require('./coord.cjs');
 | 
						|
var precess = require('./precess.cjs');
 | 
						|
 | 
						|
/**
 | 
						|
 * @copyright 2013 Sonia Keys
 | 
						|
 * @copyright 2016 commenthol
 | 
						|
 * @license MIT
 | 
						|
 * @module planetposition
 | 
						|
 */
 | 
						|
 | 
						|
function sum (t, series) {
 | 
						|
  const coeffs = [];
 | 
						|
  Object.keys(series).forEach((x) => {
 | 
						|
    coeffs[x] = 0;
 | 
						|
    let y = series[x].length - 1;
 | 
						|
    for (y; y >= 0; y--) {
 | 
						|
      const term = {
 | 
						|
        a: series[x][y][0],
 | 
						|
        b: series[x][y][1],
 | 
						|
        c: series[x][y][2]
 | 
						|
      };
 | 
						|
      coeffs[x] += term.a * Math.cos(term.b + term.c * t);
 | 
						|
    }
 | 
						|
  });
 | 
						|
  const res = base["default"].horner(t, ...coeffs);
 | 
						|
  return res
 | 
						|
}
 | 
						|
 | 
						|
class Planet {
 | 
						|
  /**
 | 
						|
   * VSOP87 representation of a Planet
 | 
						|
   * @constructs Planet
 | 
						|
   * @param {object} planet - planet data series
 | 
						|
   * @example
 | 
						|
   * ```js
 | 
						|
   * // for use in browser
 | 
						|
   * import {data} from 'astronomia'
 | 
						|
   * const earth = new planetposition.Planet(data.vsop87Bearth)
 | 
						|
   * ```
 | 
						|
   */
 | 
						|
  constructor (planet) {
 | 
						|
    if (typeof planet !== 'object') throw new TypeError('need planet vsop87 data')
 | 
						|
    this.name = planet.name;
 | 
						|
    this.type = planet.type || 'B';
 | 
						|
    this.series = planet;
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Position2000 returns ecliptic position of planets by full VSOP87 theory.
 | 
						|
   *
 | 
						|
   * @param {Number} jde - the date for which positions are desired.
 | 
						|
   * @returns {Coord} Results are for the dynamical equinox and ecliptic J2000.
 | 
						|
   *  {Number} lon - heliocentric longitude in radians.
 | 
						|
   *  {Number} lat - heliocentric latitude in radians.
 | 
						|
   *  {Number} range - heliocentric range in AU.
 | 
						|
   */
 | 
						|
  position2000 (jde) {
 | 
						|
    const T = base["default"].J2000Century(jde);
 | 
						|
    const τ = T * 0.1;
 | 
						|
    const lon = base["default"].pmod(sum(τ, this.series.L), 2 * Math.PI);
 | 
						|
    const lat = sum(τ, this.series.B);
 | 
						|
    const range = sum(τ, this.series.R);
 | 
						|
 | 
						|
    switch (this.type) {
 | 
						|
      case 'B':
 | 
						|
        return new base["default"].Coord(lon, lat, range)
 | 
						|
      case 'D': {
 | 
						|
        const eclFrom = new coord["default"].Ecliptic(lon, lat);
 | 
						|
        const epochFrom = base["default"].JDEToJulianYear(jde);
 | 
						|
        const epochTo = 2000.0;
 | 
						|
        const eclTo = precess["default"].eclipticPosition(eclFrom, epochFrom, epochTo);
 | 
						|
        return new base["default"].Coord(eclTo.lon, eclTo.lat, range)
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  /**
 | 
						|
   * Position returns ecliptic position of planets at equinox and ecliptic of date.
 | 
						|
   *
 | 
						|
   * @param {Number} jde - the date for which positions are desired.
 | 
						|
   * @returns {Coord} Results are positions consistent with those from Meeus's
 | 
						|
   * Apendix III, that is, at equinox and ecliptic of date.
 | 
						|
   *  {Number} lon - heliocentric longitude in radians.
 | 
						|
   *  {Number} lat - heliocentric latitude in radians.
 | 
						|
   *  {Number} range - heliocentric range in AU.
 | 
						|
   */
 | 
						|
  position (jde) {
 | 
						|
    const T = base["default"].J2000Century(jde);
 | 
						|
    const τ = T * 0.1;
 | 
						|
    const lon = base["default"].pmod(sum(τ, this.series.L), 2 * Math.PI);
 | 
						|
    const lat = sum(τ, this.series.B);
 | 
						|
    const range = sum(τ, this.series.R);
 | 
						|
 | 
						|
    switch (this.type) {
 | 
						|
      case 'B': {
 | 
						|
        const eclFrom = new coord["default"].Ecliptic(lon, lat);
 | 
						|
        const epochFrom = 2000.0;
 | 
						|
        const epochTo = base["default"].JDEToJulianYear(jde);
 | 
						|
        const eclTo = precess["default"].eclipticPosition(eclFrom, epochFrom, epochTo);
 | 
						|
        return new base["default"].Coord(eclTo.lon, eclTo.lat, range)
 | 
						|
      }
 | 
						|
      case 'D':
 | 
						|
        return new base["default"].Coord(lon, lat, range)
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * ToFK5 converts ecliptic longitude and latitude from dynamical frame to FK5.
 | 
						|
 *
 | 
						|
 * @param {Number} lon - ecliptic longitude in radians
 | 
						|
 * @param {Number} lat - ecliptic latitude in radians
 | 
						|
 * @param {Number} jde - Julian ephemeris day
 | 
						|
 * @return {Coord}
 | 
						|
 *    {Number} lon - FK5 longitude
 | 
						|
 *    {Number} lat - FK5 latitude
 | 
						|
 */
 | 
						|
function toFK5 (lon, lat, jde) {
 | 
						|
  // formula 32.3, p. 219.
 | 
						|
  const T = base["default"].J2000Century(jde);
 | 
						|
  // const Lp = lon - 1.397 * Math.PI / 180 * T - 0.00031 * Math.PI / 180 * T * T
 | 
						|
  const Lp = lon - sexagesimal["default"].angleFromDeg((1.397 + 0.00031 * T) * T);
 | 
						|
  const [sLp, cLp] = base["default"].sincos(Lp);
 | 
						|
  // (32.3) p. 219
 | 
						|
  const L5 = lon + sexagesimal["default"].angleFromSec(-0.09033 + 0.03916 * (cLp + sLp) * Math.tan(lat));
 | 
						|
  const B5 = lat + sexagesimal["default"].angleFromSec(0.03916 * (cLp - sLp));
 | 
						|
  return new base["default"].Coord(L5, B5)
 | 
						|
}
 | 
						|
 | 
						|
var planetposition = {
 | 
						|
  Planet,
 | 
						|
  toFK5
 | 
						|
};
 | 
						|
 | 
						|
exports.Planet = Planet;
 | 
						|
exports["default"] = planetposition;
 | 
						|
exports.toFK5 = toFK5;
 |