UNPKG

15 kBJavaScriptView Raw
1/**
2 * @copyright 2013 Sonia Keys
3 * @copyright 2016 commenthol
4 * @license MIT
5 * @module apparent
6 */
7/**
8 * Apparent: Chapter 23, Apparent Place of a Star
9 */
10
11import base from './base';
12import coord from './coord';
13import _nutation from './nutation';
14import precess from './precess';
15import solar from './solar';
16var cos = Math.cos,
17 tan = Math.tan;
18
19/**
20 * Nutation returns corrections due to nutation for equatorial coordinates
21 * of an object.
22 *
23 * Results are invalid for objects very near the celestial poles.
24 * @param {Number} α - right ascension
25 * @param {Number} δ - declination
26 * @param {Number} jd - Julian Day
27 * @return {Number[]} [Δα1, Δδ1] -
28*/
29
30export function nutation(α, δ, jd) {
31 // (α, δ, jd float64) (Δα1, Δδ1 float64)
32 var ε = _nutation.meanObliquity(jd);
33
34 var _base$sincos = base.sincos(ε),
35 sinε = _base$sincos[0],
36 cosε = _base$sincos[1];
37
38 var _nutation$nutation = _nutation.nutation(jd),
39 Δψ = _nutation$nutation[0],
40 Δε = _nutation$nutation[1];
41
42 var _base$sincos2 = base.sincos(α),
43 sinα = _base$sincos2[0],
44 cosα = _base$sincos2[1];
45
46 var tanδ = tan(δ);
47 // (23.1) p. 151
48 var Δα1 = (cosε + sinε * sinα * tanδ) * Δψ - cosα * tanδ * Δε;
49 var Δδ1 = sinε * cosα * Δψ + sinα * Δε;
50 return [Δα1, Δδ1];
51}
52
53/**
54 * κ is the constant of aberration in radians.
55 */
56var κ = 20.49552 * Math.PI / 180 / 3600;
57
58/**
59 * longitude of perihelian of Earth's orbit.
60 */
61export function perihelion(T) {
62 // (T float64) float64
63 return base.horner(T, 102.93735, 1.71946, 0.00046) * Math.PI / 180;
64}
65
66/**
67 * EclipticAberration returns corrections due to aberration for ecliptic
68 * coordinates of an object.
69 */
70export function eclipticAberration(λ, β, jd) {
71 // (λ, β, jd float64) (Δλ, Δβ float64)
72 var T = base.J2000Century(jd);
73
74 var _solar$trueLongitude = solar.trueLongitude(T),
75 lon = _solar$trueLongitude.lon,
76 ano = _solar$trueLongitude.ano; // eslint-disable-line no-unused-vars
77
78
79 var e = solar.eccentricity(T);
80 var π = perihelion(T);
81
82 var _base$sincos3 = base.sincos(β),
83 sβ = _base$sincos3[0],
84 cβ = _base$sincos3[1];
85
86 var _base$sincos4 = base.sincos(lon - λ),
87 ssλ = _base$sincos4[0],
88 csλ = _base$sincos4[1];
89
90 var _base$sincos5 = base.sincos(π - λ),
91 sinπλ = _base$sincos5[0],
92 cosπλ = _base$sincos5[1];
93 // (23.2) p. 151
94
95
96 var Δλ = κ * (e * cosπλ - csλ) / cβ;
97 var Δβ = -κ * sβ * (ssλ - e * sinπλ);
98 return [Δλ, Δβ];
99}
100
101/**
102 * Aberration returns corrections due to aberration for equatorial
103 * coordinates of an object.
104 */
105export function aberration(α, δ, jd) {
106 // (α, δ, jd float64) (Δα2, Δδ2 float64)
107 var ε = _nutation.meanObliquity(jd);
108 var T = base.J2000Century(jd);
109
110 var _solar$trueLongitude2 = solar.trueLongitude(T),
111 lon = _solar$trueLongitude2.lon,
112 ano = _solar$trueLongitude2.ano; // eslint-disable-line no-unused-vars
113
114
115 var e = solar.eccentricity(T);
116 var π = perihelion(T);
117
118 var _base$sincos6 = base.sincos(α),
119 sinα = _base$sincos6[0],
120 cosα = _base$sincos6[1];
121
122 var _base$sincos7 = base.sincos(δ),
123 sinδ = _base$sincos7[0],
124 cosδ = _base$sincos7[1];
125
126 var _base$sincos8 = base.sincos(lon),
127 sins = _base$sincos8[0],
128 coss = _base$sincos8[1];
129
130 var _base$sincos9 = base.sincos(π),
131 sinπ = _base$sincos9[0],
132 cosπ = _base$sincos9[1];
133
134 var cosε = cos(ε);
135 var q1 = cosα * cosε;
136 // (23.3) p. 152
137 var Δα2 = κ * (e * (q1 * cosπ + sinα * sinπ) - (q1 * coss + sinα * sins)) / cosδ;
138 var q2 = cosε * (tan(ε) * cosδ - sinα * sinδ);
139 var q3 = cosα * sinδ;
140 var Δδ2 = κ * (e * (cosπ * q2 + sinπ * q3) - (coss * q2 + sins * q3));
141 return [Δα2, Δδ2];
142}
143
144/**
145 * Position computes the apparent position of an object.
146 *
147 * Position is computed for equatorial coordinates in eqFrom, considering
148 * proper motion, precession, nutation, and aberration. Result is in
149 * eqTo. EqFrom and eqTo must be non-nil, but may point to the same struct.
150 */
151export function position(eqFrom, epochFrom, epochTo, mα, mδ) {
152 // (eqFrom, eqTo *coord.Equatorial, epochFrom, epochTo float64, mα sexa.HourAngle, mδ sexa.Angle) *coord.Equatorial
153 var eqTo = precess.position(eqFrom, epochFrom, epochTo, mα, mδ);
154 var jd = base.JulianYearToJDE(epochTo);
155
156 var _nutation2 = nutation(eqTo.ra, eqTo.dec, jd),
157 Δα1 = _nutation2[0],
158 Δδ1 = _nutation2[1];
159
160 var _aberration = aberration(eqTo.ra, eqTo.dec, jd),
161 Δα2 = _aberration[0],
162 Δδ2 = _aberration[1];
163
164 eqTo.ra += Δα1 + Δα2;
165 eqTo.dec += Δδ1 + Δδ2;
166 return eqTo;
167}
168
169/**
170 * AberrationRonVondrak uses the Ron-Vondrák expression to compute corrections
171 * due to aberration for equatorial coordinates of an object.
172 */
173export function aberrationRonVondrak(α, δ, jd) {
174 // (α, δ, jd float64) (Δα, Δδ float64)
175 var T = base.J2000Century(jd);
176 var r = {
177 T: T,
178 L2: 3.1761467 + 1021.3285546 * T,
179 L3: 1.7534703 + 628.3075849 * T,
180 L4: 6.2034809 + 334.0612431 * T,
181 L5: 0.5995465 + 52.9690965 * T,
182 L6: 0.8740168 + 21.3299095 * T,
183 L7: 5.4812939 + 7.4781599 * T,
184 L8: 5.3118863 + 3.8133036 * T,
185 Lp: 3.8103444 + 8399.6847337 * T,
186 D: 5.1984667 + 7771.3771486 * T,
187 Mp: 2.3555559 + 8328.6914289 * T,
188 F: 1.6279052 + 8433.4661601 * T
189 };
190 var Xp = 0;
191 var Yp = 0;
192 var Zp = 0;
193 // sum smaller terms first
194 for (var i = 35; i >= 0; i--) {
195 var _rvTerm$i = rvTerm[i](r),
196 x = _rvTerm$i[0],
197 y = _rvTerm$i[1],
198 z = _rvTerm$i[2];
199
200 Xp += x;
201 Yp += y;
202 Zp += z;
203 }
204
205 var _base$sincos10 = base.sincos(α),
206 sinα = _base$sincos10[0],
207 cosα = _base$sincos10[1];
208
209 var _base$sincos11 = base.sincos(δ),
210 sinδ = _base$sincos11[0],
211 cosδ = _base$sincos11[1];
212 // (23.4) p. 156
213
214
215 return [(Yp * cosα - Xp * sinα) / (c * cosδ), -((Xp * cosα + Yp * sinα) * sinδ - Zp * cosδ) / c];
216}
217
218var c = 17314463350; // unit is 1e-8 AU / day
219
220// r = {T, L2, L3, L4, L5, L6, L7, L8, Lp, D, Mp, F}
221var rvTerm = [function (r) {
222 // 1
223 var _base$sincos12 = base.sincos(r.L3),
224 sinA = _base$sincos12[0],
225 cosA = _base$sincos12[1];
226
227 return [(-1719914 - 2 * r.T) * sinA - 25 * cosA, (25 - 13 * r.T) * sinA + (1578089 + 156 * r.T) * cosA, (10 + 32 * r.T) * sinA + (684185 - 358 * r.T) * cosA];
228}, function (r) {
229 // 2
230 var _base$sincos13 = base.sincos(2 * r.L3),
231 sinA = _base$sincos13[0],
232 cosA = _base$sincos13[1];
233
234 return [(6434 + 141 * r.T) * sinA + (28007 - 107 * r.T) * cosA, (25697 - 95 * r.T) * sinA + (-5904 - 130 * r.T) * cosA, (11141 - 48 * r.T) * sinA + (-2559 - 55 * r.T) * cosA];
235}, function (r) {
236 // 3
237 var _base$sincos14 = base.sincos(r.L5),
238 sinA = _base$sincos14[0],
239 cosA = _base$sincos14[1];
240
241 return [715 * sinA, 6 * sinA - 657 * cosA, -15 * sinA - 282 * cosA];
242}, function (r) {
243 // 4
244 var _base$sincos15 = base.sincos(r.Lp),
245 sinA = _base$sincos15[0],
246 cosA = _base$sincos15[1];
247
248 return [715 * sinA, -656 * cosA, -285 * cosA];
249}, function (r) {
250 // 5
251 var _base$sincos16 = base.sincos(3 * r.L3),
252 sinA = _base$sincos16[0],
253 cosA = _base$sincos16[1];
254
255 return [(486 - 5 * r.T) * sinA + (-236 - 4 * r.T) * cosA, (-216 - 4 * r.T) * sinA + (-446 + 5 * r.T) * cosA, -94 * sinA - 193 * cosA];
256}, function (r) {
257 // 6
258 var _base$sincos17 = base.sincos(r.L6),
259 sinA = _base$sincos17[0],
260 cosA = _base$sincos17[1];
261
262 return [159 * sinA, 2 * sinA - 147 * cosA, -6 * sinA - 61 * cosA];
263}, function (r) {
264 // 7
265 var cosA = Math.cos(r.F);
266 return [0, 26 * cosA, -59 * cosA];
267}, function (r) {
268 // 8
269 var _base$sincos18 = base.sincos(r.Lp + r.Mp),
270 sinA = _base$sincos18[0],
271 cosA = _base$sincos18[1];
272
273 return [39 * sinA, -36 * cosA, -16 * cosA];
274}, function (r) {
275 // 9
276 var _base$sincos19 = base.sincos(2 * r.L5),
277 sinA = _base$sincos19[0],
278 cosA = _base$sincos19[1];
279
280 return [33 * sinA - 10 * cosA, -9 * sinA - 30 * cosA, -5 * sinA - 13 * cosA];
281}, function (r) {
282 // 10
283 var _base$sincos20 = base.sincos(2 * r.L3 - r.L5),
284 sinA = _base$sincos20[0],
285 cosA = _base$sincos20[1];
286
287 return [31 * sinA + cosA, sinA - 28 * cosA, -12 * cosA];
288}, function (r) {
289 // 11
290 var _base$sincos21 = base.sincos(3 * r.L3 - 8 * r.L4 + 3 * r.L5),
291 sinA = _base$sincos21[0],
292 cosA = _base$sincos21[1];
293
294 return [8 * sinA - 28 * cosA, 25 * sinA + 8 * cosA, 11 * sinA + 3 * cosA];
295}, function (r) {
296 // 12
297 var _base$sincos22 = base.sincos(5 * r.L3 - 8 * r.L4 + 3 * r.L5),
298 sinA = _base$sincos22[0],
299 cosA = _base$sincos22[1];
300
301 return [8 * sinA - 28 * cosA, -25 * sinA - 8 * cosA, -11 * sinA + -3 * cosA];
302}, function (r) {
303 // 13
304 var _base$sincos23 = base.sincos(2 * r.L2 - r.L3),
305 sinA = _base$sincos23[0],
306 cosA = _base$sincos23[1];
307
308 return [21 * sinA, -19 * cosA, -8 * cosA];
309}, function (r) {
310 // 14
311 var _base$sincos24 = base.sincos(r.L2),
312 sinA = _base$sincos24[0],
313 cosA = _base$sincos24[1];
314
315 return [-19 * sinA, 17 * cosA, 8 * cosA];
316}, function (r) {
317 // 15
318 var _base$sincos25 = base.sincos(r.L7),
319 sinA = _base$sincos25[0],
320 cosA = _base$sincos25[1];
321
322 return [17 * sinA, -16 * cosA, -7 * cosA];
323}, function (r) {
324 // 16
325 var _base$sincos26 = base.sincos(r.L3 - 2 * r.L5),
326 sinA = _base$sincos26[0],
327 cosA = _base$sincos26[1];
328
329 return [16 * sinA, 15 * cosA, sinA + 7 * cosA];
330}, function (r) {
331 // 17
332 var _base$sincos27 = base.sincos(r.L8),
333 sinA = _base$sincos27[0],
334 cosA = _base$sincos27[1];
335
336 return [16 * sinA, sinA - 15 * cosA, -3 * sinA - 6 * cosA];
337}, function (r) {
338 // 18
339 var _base$sincos28 = base.sincos(r.L3 + r.L5),
340 sinA = _base$sincos28[0],
341 cosA = _base$sincos28[1];
342
343 return [11 * sinA - cosA, -sinA - 10 * cosA, -sinA - 5 * cosA];
344}, function (r) {
345 // 19
346 var _base$sincos29 = base.sincos(2 * r.L2 - 2 * r.L3),
347 sinA = _base$sincos29[0],
348 cosA = _base$sincos29[1];
349
350 return [-11 * cosA, -10 * sinA, -4 * sinA];
351}, function (r) {
352 // 20
353 var _base$sincos30 = base.sincos(r.L3 - r.L5),
354 sinA = _base$sincos30[0],
355 cosA = _base$sincos30[1];
356
357 return [-11 * sinA - 2 * cosA, -2 * sinA + 9 * cosA, -sinA + 4 * cosA];
358}, function (r) {
359 // 21
360 var _base$sincos31 = base.sincos(4 * r.L3),
361 sinA = _base$sincos31[0],
362 cosA = _base$sincos31[1];
363
364 return [-7 * sinA - 8 * cosA, -8 * sinA + 6 * cosA, -3 * sinA + 3 * cosA];
365}, function (r) {
366 // 22
367 var _base$sincos32 = base.sincos(3 * r.L3 - 2 * r.L5),
368 sinA = _base$sincos32[0],
369 cosA = _base$sincos32[1];
370
371 return [-10 * sinA, 9 * cosA, 4 * cosA];
372}, function (r) {
373 // 23
374 var _base$sincos33 = base.sincos(r.L2 - 2 * r.L3),
375 sinA = _base$sincos33[0],
376 cosA = _base$sincos33[1];
377
378 return [-9 * sinA, -9 * cosA, -4 * cosA];
379}, function (r) {
380 // 24
381 var _base$sincos34 = base.sincos(2 * r.L2 - 3 * r.L3),
382 sinA = _base$sincos34[0],
383 cosA = _base$sincos34[1];
384
385 return [-9 * sinA, -8 * cosA, -4 * cosA];
386}, function (r) {
387 // 25
388 var _base$sincos35 = base.sincos(2 * r.L6),
389 sinA = _base$sincos35[0],
390 cosA = _base$sincos35[1];
391
392 return [-9 * cosA, -8 * sinA, -3 * sinA];
393}, function (r) {
394 // 26
395 var _base$sincos36 = base.sincos(2 * r.L2 - 4 * r.L3),
396 sinA = _base$sincos36[0],
397 cosA = _base$sincos36[1];
398
399 return [-9 * cosA, 8 * sinA, 3 * sinA];
400}, function (r) {
401 // 27
402 var _base$sincos37 = base.sincos(3 * r.L3 - 2 * r.L4),
403 sinA = _base$sincos37[0],
404 cosA = _base$sincos37[1];
405
406 return [8 * sinA, -8 * cosA, -3 * cosA];
407}, function (r) {
408 // 28
409 var _base$sincos38 = base.sincos(r.Lp + 2 * r.D - r.Mp),
410 sinA = _base$sincos38[0],
411 cosA = _base$sincos38[1];
412
413 return [8 * sinA, -7 * cosA, -3 * cosA];
414}, function (r) {
415 // 29
416 var _base$sincos39 = base.sincos(8 * r.L2 - 12 * r.L3),
417 sinA = _base$sincos39[0],
418 cosA = _base$sincos39[1];
419
420 return [-4 * sinA - 7 * cosA, -6 * sinA + 4 * cosA, -3 * sinA + 2 * cosA];
421}, function (r) {
422 // 30
423 var _base$sincos40 = base.sincos(8 * r.L2 - 14 * r.L3),
424 sinA = _base$sincos40[0],
425 cosA = _base$sincos40[1];
426
427 return [-4 * sinA - 7 * cosA, 6 * sinA - 4 * cosA, 3 * sinA - 2 * cosA];
428}, function (r) {
429 // 31
430 var _base$sincos41 = base.sincos(2 * r.L4),
431 sinA = _base$sincos41[0],
432 cosA = _base$sincos41[1];
433
434 return [-6 * sinA - 5 * cosA, -4 * sinA + 5 * cosA, -2 * sinA + 2 * cosA];
435}, function (r) {
436 // 32
437 var _base$sincos42 = base.sincos(3 * r.L2 - 4 * r.L3),
438 sinA = _base$sincos42[0],
439 cosA = _base$sincos42[1];
440
441 return [-sinA - cosA, -2 * sinA - 7 * cosA, sinA - 4 * cosA];
442}, function (r) {
443 // 33
444 var _base$sincos43 = base.sincos(2 * r.L3 - 2 * r.L5),
445 sinA = _base$sincos43[0],
446 cosA = _base$sincos43[1];
447
448 return [4 * sinA - 6 * cosA, -5 * sinA - 4 * cosA, -2 * sinA - 2 * cosA];
449}, function (r) {
450 // 34
451 var _base$sincos44 = base.sincos(3 * r.L2 - 3 * r.L3),
452 sinA = _base$sincos44[0],
453 cosA = _base$sincos44[1];
454
455 return [-7 * cosA, -6 * sinA, -3 * sinA];
456}, function (r) {
457 // 35
458 var _base$sincos45 = base.sincos(2 * r.L3 - 2 * r.L4),
459 sinA = _base$sincos45[0],
460 cosA = _base$sincos45[1];
461
462 return [5 * sinA - 5 * cosA, -4 * sinA - 5 * cosA, -2 * sinA - 2 * cosA];
463}, function (r) {
464 // 36
465 var _base$sincos46 = base.sincos(r.Lp - 2 * r.D),
466 sinA = _base$sincos46[0],
467 cosA = _base$sincos46[1];
468
469 return [5 * sinA, -5 * cosA, -2 * cosA];
470}];
471
472/**
473 * PositionRonVondrak computes the apparent position of an object using
474 * the Ron-Vondrák expression for aberration.
475 *
476 * Position is computed for equatorial coordinates in eqFrom, considering
477 * proper motion, aberration, precession, and _nutation. Result is in
478 * eqTo. EqFrom and eqTo must be non-nil, but may point to the same struct.
479 *
480 * Note the Ron-Vondrák expression is only valid for the epoch J2000.
481 * EqFrom must be coordinates at epoch J2000.
482 */
483export function positionRonVondrak(eqFrom, epochTo, mα, mδ) {
484 // (eqFrom, eqTo *coord.Equatorial, epochTo float64, mα sexa.HourAngle, mδ sexa.Angle) *coord.Equatorial
485 var t = epochTo - 2000;
486 var eqTo = new coord.Equatorial();
487 eqTo.ra = eqFrom.ra + mα.rad() * t;
488 eqTo.dec = eqFrom.dec + mδ.rad() * t;
489 var jd = base.JulianYearToJDE(epochTo);
490
491 var _aberrationRonVondrak = aberrationRonVondrak(eqTo.ra, eqTo.dec, jd),
492 Δα = _aberrationRonVondrak[0],
493 Δδ = _aberrationRonVondrak[1];
494
495 eqTo.ra += Δα;
496 eqTo.dec += Δδ;
497 eqTo = precess.position(eqTo, 2000, epochTo, 0, 0);
498
499 var _nutation3 = nutation(eqTo.ra, eqTo.dec, jd),
500 Δα1 = _nutation3[0],
501 Δδ1 = _nutation3[1];
502
503 eqTo.ra += Δα1;
504 eqTo.dec += Δδ1;
505 return eqTo;
506}
507
508export default {
509 nutation: nutation,
510 perihelion: perihelion,
511 eclipticAberration: eclipticAberration,
512 aberration: aberration,
513 position: position,
514 aberrationRonVondrak: aberrationRonVondrak,
515 positionRonVondrak: positionRonVondrak
516};
\No newline at end of file