1 #ifndef PLANET_H
2 #define PLANET_H
3 
4 #include <string>
5 
6 #include "body.h"
7 
8 class Ephemeris;
9 
10 class Planet
11 {
12  public:
13     static body parseBodyName(char *name);
14 
15     Planet(const double jd, const body this_body);
16     ~Planet();
17 
18     void calcHeliocentricEquatorial();
19     void calcHeliocentricEquatorial(const bool relativeToSun);
20 
21     void PlanetographicToXYZ(double &X, double &Y, double &Z,
22                              double lat, double lon,
23                              const double rad);
24 
25     void PlanetocentricToXYZ(double &X, double &Y, double &Z,
26                              const double lat, const double lon,
27                              const double rad);
28 
29     void XYZToPlanetocentric(const double X, const double Y, const double Z,
30                              double &lat, double &lon);
31 
32     void XYZToPlanetocentric(const double X, const double Y, const double Z,
33                              double &lat, double &lon, double &rad);
34 
35     void XYZToPlanetographic(const double X, const double Y, const double Z,
36                              double &lat, double &lon);
37 
38     void XYZToPlanetographic(const double X, const double Y, const double Z,
39                              double &lat, double &lon, double &rad);
40 
41     void XYZToPlanetaryXYZ(const double X, const double Y, const double Z,
42                            double &pX, double &pY, double &pZ);
43 
44     void PlanetaryXYZToXYZ(const double pX, const double pY, const double pZ,
45                            double &X, double &Y, double &Z);
46 
47     void PlanetocentricToPlanetographic(double &lat, double &lon) const;
48     void PlanetographicToPlanetocentric(double &lat, double &lon) const;
49 
50     void getPosition(double &X, double &Y, double &Z) const;
51 
52     void getBodyNorth(double &X, double &Y, double &Z) const;
53     void getOrbitalNorth(double &X, double &Y, double &Z) const;
54 
55     double Illumination(const double oX, const double oY, const double oZ);
56 
Index()57     body Index() const { return(index_); };
Primary()58     body Primary() const { return(primary_); };
59 
Flattening()60     double Flattening() const { return(flattening_); };
Flipped()61     int Flipped() const { return(flipped_); };
Period()62     double Period() const { return(period_); };
Radius()63     double Radius() const { return(radiusEq_); };
64     double Radius(const double lat) const;
65 
66     bool IsInMyShadow(const double x, const double y, const double z);
67 
68  private:
69     body index_;
70 
71     Ephemeris *ephem_;
72     bool ephemerisHigh_;
73     bool ephemerisSpice_;
74 
75     double julianDay_;
76     double T2000_;            // Julian centuries from 2000
77     double d2000_;            // days from 2000
78 
79     body primary_;
80 
81     double alpha0_;          // right ascension of the north pole
82     double delta0_;          // declination of the north pole
83 
84     double nullMeridian_;    // orientation of zero longitude
85     double nullMeridian0_;   // orientation of zero longitude at time 0
86     double wdot_;            // rotation rate
87 
88     double rot_[3][3];          // rotation matrix
89     double invRot_[3][3];      // inverse of e
90     bool needRotationMatrix_;
91 
92     double period_;           // orbital period, in days
93     double radiusEq_;         // equatorial radius
94     double radiusPol_;        // polar radius
95     double flattening_;       // (Re - Rp)/Re
96     double omf2_;             // (1 - flattening_)^2
97 
98     bool needShadowCoeffs_;   // used to compute shadows by ellipsoids
99     double sunX_, sunY_, sunZ_;
100     double ellipseCoeffC_;
101 
102     /*
103        flipped = 1 if planet's longitude increases to the east
104        (e.g. earth), -1 if planet's longitude increases to the west
105        (e.g. Mars),
106     */
107     int flipped_;
108 
109     double X_, Y_, Z_;      // Position vector
110 
111     void CreateRotationMatrix();
112     void ComputeShadowCoeffs();
113 };
114 
115 #endif
116