112 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			2.8 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 nearparabolic
 | 
						||
 */
 | 
						||
 | 
						||
/**
 | 
						||
 * Elements holds orbital elements for near-parabolic orbits.
 | 
						||
 */
 | 
						||
class Elements {
 | 
						||
  /**
 | 
						||
   * @param {Number} timeP - time of Perihelion, T
 | 
						||
   * @param {Number} pDis - Perihelion distance, q
 | 
						||
   * @param {Number} ecc - eccentricity, e
 | 
						||
   */
 | 
						||
  constructor (timeP, pDis, ecc) {
 | 
						||
    this.timeP = timeP;
 | 
						||
    this.pDis = pDis;
 | 
						||
    this.ecc = ecc;
 | 
						||
  }
 | 
						||
 | 
						||
  /**
 | 
						||
   * AnomalyDistance returns true anomaly and distance for near-parabolic orbits.
 | 
						||
   *
 | 
						||
   * True anomaly ν returned in radians. Distance r returned in AU.
 | 
						||
   * An error is returned if the algorithm fails to converge.
 | 
						||
   */
 | 
						||
  anomalyDistance (jde) {
 | 
						||
    // fairly literal translation of code on p. 246
 | 
						||
    const q1 = base["default"].K * Math.sqrt((1 + this.ecc) / this.pDis) / (2 * this.pDis); // line 20
 | 
						||
    const g = (1 - this.ecc) / (1 + this.ecc); // line 20
 | 
						||
 | 
						||
    const t = jde - this.timeP; // line 22
 | 
						||
    if (t === 0) { // line 24
 | 
						||
      return { ano: 0, dist: this.pDis, err: null }
 | 
						||
    }
 | 
						||
    const d1 = 1e4;
 | 
						||
    const d = 1e-9; // line 14
 | 
						||
    const q2 = q1 * t; // line 28
 | 
						||
    let s = 2.0 / (3 * Math.abs(q2)); // line 30
 | 
						||
    s = 2 / Math.tan(2 * Math.atan(Math.cbrt(Math.tan(Math.atan(s) / 2))));
 | 
						||
    if (t < 0) { // line 34
 | 
						||
      s = -s;
 | 
						||
    }
 | 
						||
    if (this.ecc !== 1) { // line 36
 | 
						||
      let l = 0; // line 38
 | 
						||
      for (;;) {
 | 
						||
        const s0 = s; // line 40
 | 
						||
        let z = 1.0;
 | 
						||
        const y = s * s;
 | 
						||
        let g1 = -y * s;
 | 
						||
        let q3 = q2 + 2 * g * s * y / 3; // line 42
 | 
						||
        for (;;) {
 | 
						||
          z += 1; // line 44
 | 
						||
          g1 = -g1 * g * y; // line 46
 | 
						||
          const z1 = (z - (z + 1) * g) / (2 * z + 1); // line 48
 | 
						||
          const f = z1 * g1; // line 50
 | 
						||
          q3 += f; // line 52
 | 
						||
          if (z > 50 || Math.abs(f) > d1) { // line 54
 | 
						||
            return {
 | 
						||
              err: new Error('No convergence')
 | 
						||
            }
 | 
						||
          }
 | 
						||
          if (Math.abs(f) <= d) { // line 56
 | 
						||
            break
 | 
						||
          }
 | 
						||
        }
 | 
						||
        l++; // line 58
 | 
						||
        if (l > 50) {
 | 
						||
          return {
 | 
						||
            err: new Error('No convergence')
 | 
						||
          }
 | 
						||
        }
 | 
						||
        for (;;) {
 | 
						||
          const s1 = s; // line 60
 | 
						||
          s = (2 * s * s * s / 3 + q3) / (s * s + 1);
 | 
						||
          if (Math.abs(s - s1) <= d) { // line 62
 | 
						||
            break
 | 
						||
          }
 | 
						||
        }
 | 
						||
        if (Math.abs(s - s0) <= d) { // line 64
 | 
						||
          break
 | 
						||
        }
 | 
						||
      }
 | 
						||
    }
 | 
						||
    let ν = 2 * Math.atan(s); // line 66
 | 
						||
    const r = this.pDis * (1 + this.ecc) / (1 + this.ecc * Math.cos(ν)); // line 68
 | 
						||
    if (ν < 0) { // line 70
 | 
						||
      ν += 2 * Math.PI;
 | 
						||
    }
 | 
						||
    return {
 | 
						||
      ano: ν,
 | 
						||
      dist: r,
 | 
						||
      err: null
 | 
						||
    }
 | 
						||
  }
 | 
						||
}
 | 
						||
 | 
						||
var nearparabolic = {
 | 
						||
  Elements
 | 
						||
};
 | 
						||
 | 
						||
exports.Elements = Elements;
 | 
						||
exports["default"] = nearparabolic;
 |