-
Notifications
You must be signed in to change notification settings - Fork 47
/
getplane.cpp
88 lines (76 loc) · 3.47 KB
/
getplane.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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
/* getplane.cpp: functions for computing planetary ephems
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 <string.h>
#include "watdefs.h"
#include "lunar.h"
#include "afuncs.h"
#define PI 3.1415926535897932384626433832795028841971693993751058209749445923
/* The compute_planet( ) function is supposed to provide a "standardized"
way to get positions for planets and the moon, in any of four systems.
You give it a pointer to the VSOP data, a planet number (0=sun,
1=mercury, ... 9 = Pluto, 10 = the Moon), and a time in centuries
from J2000. The returned array of fifteen doubles gives you the object
position in five different systems:
ovals[0, 1, 2] = lon, lat, r, heliocentric ecliptic of date;
ovals[3, 4, 5] = x, y, z, heliocentric ecliptic of date;
ovals[6, 7, 8] = x, y, z, heliocentric equatorial of date;
ovals[9, 10, 11] = x, y, z, heliocentric equatorial, J2000.0
ovals[12, 13, 14] = x, y, z, heliocentric ecliptical, J2000.0
I intended to rig this up so you could keep on going to 11=Io, 12=Europa,
etc. This would make all sorts of sense. But I've not done it yet. */
int DLL_FUNC compute_planet( const char FAR *vsop_data, const int planet_no,
const double t_c, double DLLPTR *ovals)
{
double lat, lon, r;
const double obliquit = mean_obliquity( t_c);
double matrix[9];
const double obliq_2000 = 23.4392911 * PI / 180.;
/* first, compute polar heliocentric in eclip of date */
if( planet_no != 10)
{
lon = calc_vsop_loc( vsop_data, planet_no, 0, t_c, 0.);
lat = calc_vsop_loc( vsop_data, planet_no, 1, t_c, 0.);
r = calc_vsop_loc( vsop_data, planet_no, 2, t_c, 0.);
}
else
{
double fund[N_FUND];
lunar_fundamentals( vsop_data, t_c, fund);
lat = lunar_lat( vsop_data, fund, 0L);
lunar_lon_and_dist( vsop_data, fund, &lon, &r, 0L);
lon *= PI / 180.;
lat *= PI / 180.;
r /= AU_IN_KM; /* from km to AU */
}
ovals[0] = lon;
ovals[1] = lat;
ovals[2] = r;
/* next, compute polar cartesian in eclip of date */
ovals[3] = cos( lon) * cos( lat) * r;
ovals[4] = sin( lon) * cos( lat) * r;
ovals[5] = sin( lat) * r;
/* next, compute polar cartesian in eclip of date, */
/* but in equatorial coords */
FMEMCPY( ovals + 6, ovals + 3, 3 * sizeof( double));
rotate_vector( ovals + 6, obliquit, 0);
/* next, precess to get J2000.0 equatorial values */
setup_precession( matrix, 2000. + t_c * 100., 2000.);
precess_vector( matrix, ovals + 6, ovals + 9);
/* Finally, rotate equatorial J2000.0 into ecliptical J2000 */
FMEMCPY( ovals + 12, ovals + 9, 3 * sizeof( double));
rotate_vector( ovals + 12, -obliq_2000, 0);
return( 0);
}