]> git.mxchange.org Git - flightgear.git/blobdiff - Astro/celestialBody.cxx
Changes contributed by Durk Talsma:
[flightgear.git] / Astro / celestialBody.cxx
index baa0646c98c7e8500568babfd8ef5599a608a483..8af66d78b6cd7aaedc847d6fda7e6990fac5cbd5 100644 (file)
 #include "star.hxx"
 #include <Debug/logstream.hxx>
 
+#ifdef FG_MATH_EXCEPTION_CLASH
+#  define exception c_exception
+#endif
+#include <math.h>
+
 /**************************************************************************
  * void CelestialBody::updatePosition(fgTIME *t, Star *ourSun)
  *
@@ -72,7 +77,10 @@ void CelestialBody::updatePosition(fgTIME *t, Star *ourSun)
   xg = xh + ourSun->getxs();
   yg = yh + ourSun->getys();
   zg = zh;
-  
+
+  lonEcl = atan2(yh, xh);
+  latEcl = atan2(zh, sqrt(xh*xh+yh*yh));
+
   xe = xg;
   ye = yg * cos(ecl) - zg * sin(ecl);
   ze = yg * sin(ecl) + zg * cos(ecl);
@@ -85,7 +93,19 @@ void CelestialBody::updatePosition(fgTIME *t, Star *ourSun)
   //of the planet
   R = sqrt (xg*xg + yg*yg + zg*zg);
   s = ourSun->getDistance();
-  FV = RAD_TO_DEG * acos( (r*r + R*R - s*s) / (2*r*R));
+
+  // It is possible from these calculations for the argument to acos
+  // to exceed the valid range for acos(). So we do a little extra
+  // checking.
+
+  double tmp = (r*r + R*R - s*s) / (2*r*R);
+  if ( tmp > 1.0) { 
+      tmp = 1.0;
+  } else if ( tmp < -1.0) {
+      tmp = -1.0;
+  }
+
+  FV = RAD_TO_DEG * acos( tmp );
 };
 
 /****************************************************************************
@@ -150,3 +170,8 @@ double CelestialBody::fgCalcEccAnom(double M, double e)
 
 
 
+
+
+
+
+