1 /**************************************************************************
3 * Written by Durk Talsma. Originally started October 1997, for distribution
4 * with the FlightGear project. Version 2 was written in August and
5 * September 1998. This code is based upon algorithms and data kindly
6 * provided by Mr. Paul Schlyter. (pausch@saaf.se).
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License as
10 * published by the Free Software Foundation; either version 2 of the
11 * License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful, but
14 * WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 **************************************************************************/
26 #ifndef _CELESTIALBODY_H_
27 #define _CELESTIALBODY_H_
30 # error This library requires C++
34 #include <simgear/constants.h>
40 protected: // make the data protected, in order to give the
41 // inherited classes direct access to the data
42 double NFirst; /* longitude of the ascending node first part */
43 double NSec; /* longitude of the ascending node second part */
44 double iFirst; /* inclination to the ecliptic first part */
45 double iSec; /* inclination to the ecliptic second part */
46 double wFirst; /* first part of argument of perihelion */
47 double wSec; /* second part of argument of perihelion */
48 double aFirst; /* semimayor axis first part*/
49 double aSec; /* semimayor axis second part */
50 double eFirst; /* eccentricity first part */
51 double eSec; /* eccentricity second part */
52 double MFirst; /* Mean anomaly first part */
53 double MSec; /* Mean anomaly second part */
55 double N, i, w, a, e, M; /* the resulting orbital elements, obtained from the former */
57 double rightAscension, declination;
60 double lonEcl, latEcl;
62 double fgCalcEccAnom(double M, double e);
63 double fgCalcActTime(double mjd);
64 void updateOrbElements(double mjd);
67 CelestialBody(double Nf, double Ns,
72 double Mf, double Ms, double mjd);
73 CelestialBody(double Nf, double Ns,
78 double Mf, double Ms);
79 void getPos(double *ra, double *dec);
80 void getPos(double *ra, double *dec, double *magnitude);
81 double getRightAscension();
82 double getDeclination();
83 double getMagnitude();
86 void updatePosition(double mjd, Star *ourSun);
89 /*****************************************************************************
90 * inline CelestialBody::CelestialBody
91 * public constructor for a generic celestialBody object.
92 * initializes the 6 primary orbital elements. The elements are:
93 * N: longitude of the ascending node
94 * i: inclination to the ecliptic
95 * w: argument of perihelion
96 * a: semi-major axis, or mean distance from the sun
99 * Each orbital element consists of a constant part and a variable part that
100 * gradually changes over time.
103 * the 13 arguments to the constructor constitute the first, constant
104 * ([NiwaeM]f) and the second variable ([NiwaeM]s) part of the orbital
105 * elements. The 13th argument is the current time. Note that the inclination
106 * is written with a capital (If, Is), because 'if' is a reserved word in the
107 * C/C++ programming language.
108 ***************************************************************************/
109 inline CelestialBody::CelestialBody(double Nf, double Ns,
110 double If, double Is,
111 double wf, double ws,
112 double af, double as,
113 double ef, double es,
114 double Mf, double Ms, double mjd)
116 NFirst = Nf; NSec = Ns;
117 iFirst = If; iSec = Is;
118 wFirst = wf; wSec = ws;
119 aFirst = af; aSec = as;
120 eFirst = ef; eSec = es;
121 MFirst = Mf; MSec = Ms;
122 updateOrbElements(mjd);
125 inline CelestialBody::CelestialBody(double Nf, double Ns,
126 double If, double Is,
127 double wf, double ws,
128 double af, double as,
129 double ef, double es,
130 double Mf, double Ms)
132 NFirst = Nf; NSec = Ns;
133 iFirst = If; iSec = Is;
134 wFirst = wf; wSec = ws;
135 aFirst = af; aSec = as;
136 eFirst = ef; eSec = es;
137 MFirst = Mf; MSec = Ms;
140 /****************************************************************************
141 * inline void CelestialBody::updateOrbElements(double mjd)
142 * given the current time, this private member calculates the actual
145 * Arguments: double mjd: the current modified julian date:
148 ***************************************************************************/
149 inline void CelestialBody::updateOrbElements(double mjd)
151 double actTime = fgCalcActTime(mjd);
152 M = DEG_TO_RAD * (MFirst + (MSec * actTime));
153 w = DEG_TO_RAD * (wFirst + (wSec * actTime));
154 N = DEG_TO_RAD * (NFirst + (NSec * actTime));
155 i = DEG_TO_RAD * (iFirst + (iSec * actTime));
156 e = eFirst + (eSec * actTime);
157 a = aFirst + (aSec * actTime);
159 /*****************************************************************************
160 * inline double CelestialBody::fgCalcActTime(double mjd)
161 * this private member function returns the offset in days from the epoch for
162 * wich the orbital elements are calculated (Jan, 1st, 2000).
164 * Argument: the current time
166 * return value: the (fractional) number of days until Jan 1, 2000.
167 ****************************************************************************/
168 inline double CelestialBody::fgCalcActTime(double mjd)
170 return (mjd - 36523.5);
173 /*****************************************************************************
174 * inline void CelestialBody::getPos(double* ra, double* dec)
175 * gives public access to Right Ascension and declination
177 ****************************************************************************/
178 inline void CelestialBody::getPos(double* ra, double* dec)
180 *ra = rightAscension;
184 /*****************************************************************************
185 * inline void CelestialBody::getPos(double* ra, double* dec, double* magnitude
186 * gives public acces to the current Right ascension, declination, and
188 ****************************************************************************/
189 inline void CelestialBody::getPos(double* ra, double* dec, double* magn)
191 *ra = rightAscension;
196 inline double CelestialBody::getRightAscension() { return rightAscension; }
197 inline double CelestialBody::getDeclination() { return declination; }
198 inline double CelestialBody::getMagnitude() { return magnitude; }
200 inline double CelestialBody::getLon()
205 inline double CelestialBody::getLat()
210 #endif // _CELESTIALBODY_H_