1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.Elements = undefined;
|
7 |
|
8 | var _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 |
|
19 | var _base = require('./base');
|
20 |
|
21 | var _base2 = _interopRequireDefault(_base);
|
22 |
|
23 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
24 |
|
25 | function _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 | */
|
30 | var 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 |
|
136 | exports.default = {
|
137 | Elements: Elements
|
138 | }; |
\ | No newline at end of file |