]> git.mxchange.org Git - simgear.git/commitdiff
Catch a possible floating point error in SGGeodesy::SGCartToGeod() for cartesian...
authortorsten <torsten>
Tue, 22 Sep 2009 14:17:45 +0000 (14:17 +0000)
committerTim Moore <timoore@redhat.com>
Tue, 22 Sep 2009 20:44:38 +0000 (22:44 +0200)
simgear/math/SGGeodesy.cxx

index 9971829af315ce299bd8ca95abce973de0196069..208218b73acb577e2605e16eea60aafddcea72ae 100644 (file)
@@ -79,6 +79,17 @@ SGGeodesy::SGCartToGeod(const SGVec3<double>& cart, SGGeod& geod)
   double Y = cart(1);
   double Z = cart(2);
   double XXpYY = X*X+Y*Y;
+  if( XXpYY + Z*Z < 25 ) {
+    // This function fails near the geocenter region, so catch that special case here.
+    // Define the innermost sphere of small radius as earth center and return the 
+    // coordinates 0/0/-EQURAD. It may be any other place on geoide's surface,
+    // the Northpole, Hawaii or Wentorf. This one was easy to code ;-)
+    geod.setLongitudeRad( 0.0 );
+    geod.setLongitudeRad( 0.0 );
+    geod.setElevationM( -EQURAD );
+    return;
+  }
+    
   double sqrtXXpYY = sqrt(XXpYY);
   double p = XXpYY*ra2;
   double q = Z*Z*(1-e2)*ra2;