UNPKG

7.01 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.Elements = undefined;
7
8var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /**
9 * @copyright 2013 Sonia Keys
10 * @copyright 2016 commenthol
11 * @license MIT
12 * @module nearparabolic
13 */
14/**
15 * Nearparabolic: Chapter 35, Near-parabolic Motion.
16 */
17
18
19var _base = require('./base');
20
21var _base2 = _interopRequireDefault(_base);
22
23function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
24
25function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
26
27/**
28 * Elements holds orbital elements for near-parabolic orbits.
29 */
30var Elements = exports.Elements = function () {
31 /**
32 * @param {Number} timeP - time of Perihelion, T
33 * @param {Number} pDis - Perihelion distance, q
34 * @param {Number} ecc - eccentricity, e
35 */
36 function Elements(timeP, pDis, ecc) {
37 _classCallCheck(this, Elements);
38
39 this.timeP = timeP;
40 this.pDis = pDis;
41 this.ecc = ecc;
42 }
43
44 /**
45 * AnomalyDistance returns true anomaly and distance for near-parabolic orbits.
46 *
47 * True anomaly ν returned in radians. Distance r returned in AU.
48 * An error is returned if the algorithm fails to converge.
49 */
50
51
52 _createClass(Elements, [{
53 key: 'anomalyDistance',
54 value: function anomalyDistance(jde) {
55 // fairly literal translation of code on p. 246
56 var q1 = _base2.default.K * Math.sqrt((1 + this.ecc) / this.pDis) / (2 * this.pDis); // line 20
57 var g = (1 - this.ecc) / (1 + this.ecc); // line 20
58
59 var t = jde - this.timeP; // line 22
60 if (t === 0) {
61 // line 24
62 return { ano: 0, dist: this.pDis, err: null };
63 }
64 var d1 = 1e4;
65 var d = 1e-9; // line 14
66 var q2 = q1 * t; // line 28
67 var s = 2.0 / (3 * Math.abs(q2)); // line 30
68 s = 2 / Math.tan(2 * Math.atan(Math.cbrt(Math.tan(Math.atan(s) / 2))));
69 if (t < 0) {
70 // line 34
71 s = -s;
72 }
73 if (this.ecc !== 1) {
74 // line 36
75 var l = 0; // line 38
76 for (;;) {
77 var s0 = s; // line 40
78 var z = 1.0;
79 var y = s * s;
80 var g1 = -y * s;
81 var q3 = q2 + 2 * g * s * y / 3; // line 42
82 for (;;) {
83 z += 1; // line 44
84 g1 = -g1 * g * y; // line 46
85 var z1 = (z - (z + 1) * g) / (2 * z + 1); // line 48
86 var f = z1 * g1; // line 50
87 q3 += f; // line 52
88 if (z > 50 || Math.abs(f) > d1) {
89 // line 54
90 return {
91 err: new Error('No convergence')
92 };
93 }
94 if (Math.abs(f) <= d) {
95 // line 56
96 break;
97 }
98 }
99 l++; // line 58
100 if (l > 50) {
101 return {
102 err: new Error('No convergence')
103 };
104 }
105 for (;;) {
106 var s1 = s; // line 60
107 s = (2 * s * s * s / 3 + q3) / (s * s + 1);
108 if (Math.abs(s - s1) <= d) {
109 // line 62
110 break;
111 }
112 }
113 if (Math.abs(s - s0) <= d) {
114 // line 64
115 break;
116 }
117 }
118 }
119 var ν = 2 * Math.atan(s); // line 66
120 var r = this.pDis * (1 + this.ecc) / (1 + this.ecc * Math.cos(ν)); // line 68
121 if (ν < 0) {
122 // line 70
123 ν += 2 * Math.PI;
124 }
125 return {
126 ano: ν,
127 dist: r,
128 err: null
129 };
130 }
131 }]);
132
133 return Elements;
134}();
135
136exports.default = {
137 Elements: Elements
138};
\No newline at end of file