X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fephemeris%2FcelestialBody.cxx;h=4e8873925b65ef7290aba629afcf390648d4ac29;hb=f19e83dcf10d5fced3d799c884a4654d7ada6548;hp=053dfe83a62617842e00de1f9e2058b7ffcebf18;hpb=9a211af659e744ffb2f19983761916a9f1a024ea;p=simgear.git diff --git a/simgear/ephemeris/celestialBody.cxx b/simgear/ephemeris/celestialBody.cxx index 053dfe83..4e887392 100644 --- a/simgear/ephemeris/celestialBody.cxx +++ b/simgear/ephemeris/celestialBody.cxx @@ -15,19 +15,15 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * 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. * * $Id$ **************************************************************************/ #include -#ifdef FG_MATH_EXCEPTION_CLASH -# define exception c_exception -#endif #include #include "celestialBody.hxx" @@ -62,7 +58,7 @@ void CelestialBody::updatePosition(double mjd, Star *ourSun) actTime = sgCalcActTime(mjd); // calcualate the angle bewteen ecliptic and equatorial coordinate system - ecl = DEG_TO_RAD * (23.4393 - 3.563E-7 *actTime); + ecl = SGD_DEGREES_TO_RADIANS * (23.4393 - 3.563E-7 *actTime); eccAnom = sgCalcEccAnom(M, e); //calculate the eccentric anomaly xv = a * (cos(eccAnom) - e); @@ -88,7 +84,7 @@ void CelestialBody::updatePosition(double mjd, Star *ourSun) ze = yg * sin(ecl) + zg * cos(ecl); rightAscension = atan2(ye, xe); declination = atan2(ze, sqrt(xe*xe + ye*ye)); - /* FG_LOG(FG_GENERAL, FG_INFO, "Planet found at : " + /* SG_LOG(SG_GENERAL, SG_INFO, "Planet found at : " << rightAscension << " (ra), " << declination << " (dec)" ); */ //calculate some variables specific to calculating the magnitude @@ -107,8 +103,8 @@ void CelestialBody::updatePosition(double mjd, Star *ourSun) tmp = -1.0; } - FV = RAD_TO_DEG * acos( tmp ); -}; + FV = SGD_RADIANS_TO_DEGREES * acos( tmp ); +} /**************************************************************************** * double CelestialBody::sgCalcEccAnom(double M, double e) @@ -152,28 +148,118 @@ double CelestialBody::sgCalcEccAnom(double M, double e) diff = fabs(E0 - E1); E0 = E1; } - while (diff > (DEG_TO_RAD * 0.001)); + while (diff > (SGD_DEGREES_TO_RADIANS * 0.001)); return E0; } return eccAnom; } +/***************************************************************************** + * inline CelestialBody::CelestialBody + * public constructor for a generic celestialBody object. + * initializes the 6 primary orbital elements. The elements are: + * N: longitude of the ascending node + * i: inclination to the ecliptic + * w: argument of perihelion + * a: semi-major axis, or mean distance from the sun + * e: eccenticity + * M: mean anomaly + * Each orbital element consists of a constant part and a variable part that + * gradually changes over time. + * + * Argumetns: + * the 13 arguments to the constructor constitute the first, constant + * ([NiwaeM]f) and the second variable ([NiwaeM]s) part of the orbital + * elements. The 13th argument is the current time. Note that the inclination + * is written with a capital (If, Is), because 'if' is a reserved word in the + * C/C++ programming language. + ***************************************************************************/ +CelestialBody::CelestialBody(double Nf, double Ns, + double If, double Is, + double wf, double ws, + double af, double as, + double ef, double es, + double Mf, double Ms, double mjd) +{ + NFirst = Nf; NSec = Ns; + iFirst = If; iSec = Is; + wFirst = wf; wSec = ws; + aFirst = af; aSec = as; + eFirst = ef; eSec = es; + MFirst = Mf; MSec = Ms; + updateOrbElements(mjd); +} +CelestialBody::CelestialBody(double Nf, double Ns, + double If, double Is, + double wf, double ws, + double af, double as, + double ef, double es, + double Mf, double Ms) +{ + NFirst = Nf; NSec = Ns; + iFirst = If; iSec = Is; + wFirst = wf; wSec = ws; + aFirst = af; aSec = as; + eFirst = ef; eSec = es; + MFirst = Mf; MSec = Ms; +} +/**************************************************************************** + * inline void CelestialBody::updateOrbElements(double mjd) + * given the current time, this private member calculates the actual + * orbital elements + * + * Arguments: double mjd: the current modified julian date: + * + * return value: none + ***************************************************************************/ +void CelestialBody::updateOrbElements(double mjd) +{ + double actTime = sgCalcActTime(mjd); + M = SGD_DEGREES_TO_RADIANS * (MFirst + (MSec * actTime)); + w = SGD_DEGREES_TO_RADIANS * (wFirst + (wSec * actTime)); + N = SGD_DEGREES_TO_RADIANS * (NFirst + (NSec * actTime)); + i = SGD_DEGREES_TO_RADIANS * (iFirst + (iSec * actTime)); + e = eFirst + (eSec * actTime); + a = aFirst + (aSec * actTime); +} +/***************************************************************************** + * inline double CelestialBody::sgCalcActTime(double mjd) + * this private member function returns the offset in days from the epoch for + * wich the orbital elements are calculated (Jan, 1st, 2000). + * + * Argument: the current time + * + * return value: the (fractional) number of days until Jan 1, 2000. + ****************************************************************************/ +double CelestialBody::sgCalcActTime(double mjd) +{ + return (mjd - 36523.5); +} +/***************************************************************************** + * inline void CelestialBody::getPos(double* ra, double* dec) + * gives public access to Right Ascension and declination + * + ****************************************************************************/ +void CelestialBody::getPos(double* ra, double* dec) +{ + *ra = rightAscension; + *dec = declination; +} - - - - - - - - - - - - +/***************************************************************************** + * inline void CelestialBody::getPos(double* ra, double* dec, double* magnitude + * gives public acces to the current Right ascension, declination, and + * magnitude + ****************************************************************************/ +void CelestialBody::getPos(double* ra, double* dec, double* magn) +{ + *ra = rightAscension; + *dec = declination; + *magn = magnitude; +}