/
triton.cpp
75 lines (62 loc) · 3.02 KB
/
triton.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* triton.cpp: low-precision ephems for Triton
Copyright (C) 2010, Project Pluto
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA. */
#include <math.h>
#include "watdefs.h"
#include "lunar.h"
#include "afuncs.h"
#define J2000 2451545.
#define PI 3.1415926535897932384626433832795028841971693993751058209749445923
/* For the following, see p 373 of the _Explanatory Supplement_ */
/* Note that 'rocks.cpp' also has code for computing the position of Triton.
The following is, therefore, essentially obsolete. */
void DLL_FUNC calc_triton_loc( const double jd, double *vect)
{
const double t_cent = (jd - J2000) / 36525.;
const double n = (359.28 + 54.308 * t_cent) * (PI / 180.);
const double t0 = 2433282.5;
const double theta = (151.401 + .57806 * (jd - t0) / 365.25) * (PI / 180.);
/* Semimajor axis is 488.49 arcseconds at one AU: */
const double semimajor = 488.49 * (PI / 180.) / 3600.;
const double longitude =
(200.913 + 61.2588532 * (jd - t0)) * (PI / 180.);
const double gamma = 158.996 * (PI / 180.);
/* Calculate longitude and latitude on invariable plane: */
const double lon_on_ip = theta + atan2( sin( longitude) * cos( gamma),
cos( longitude));
const double lat_on_ip = asin( sin( longitude) * sin( gamma));
/* Vectors defining invariable plane, expressed in B1950: */
double x_axis[3], y_axis[3], z_axis[3];
/* Vector defining Triton position in invariable plane space: */
double triton[3];
/* RA/dec of the pole: */
double ra_dec_p[2];
double matrix[9];
double vect_1950[3];
int i;
polar3_to_cartesian( triton, lon_on_ip, lat_on_ip);
ra_dec_p[0] = (298.72 * PI / 180.) + (2.58 * PI / 180.) * sin( n)
- (0.04 * PI / 180.) * sin( n + n);
ra_dec_p[1] = (42.63 * PI / 180.) - (1.90 * PI / 180.) * cos( n)
+ (0.01 * PI / 180.) * cos( n + n);
setup_precession( matrix, 1950., 2000.);
precess_ra_dec( matrix, ra_dec_p, ra_dec_p, 1);
polar3_to_cartesian( x_axis, ra_dec_p[0] + PI / 2., 0.);
polar3_to_cartesian( y_axis, ra_dec_p[0] + PI, PI / 2. - ra_dec_p[1]);
polar3_to_cartesian( z_axis, ra_dec_p[0], ra_dec_p[1]);
for( i = 0; i < 3; i++)
vect_1950[i] = semimajor * (x_axis[i] * triton[0] +
y_axis[i] * triton[1] + z_axis[i] * triton[2]);
precess_vector( matrix, vect_1950, vect);
}