]> git.mxchange.org Git - simgear.git/commitdiff
Fix failing BucketBox test
authorJames Turner <zakalawe@mac.com>
Mon, 24 Feb 2014 18:03:17 +0000 (18:03 +0000)
committerJames Turner <zakalawe@mac.com>
Mon, 24 Feb 2014 18:03:17 +0000 (18:03 +0000)
- improve behaviour of floorWithEpsilon helper in bucket code, and
use in more places so that near-integral values are rounded correctly.

simgear/bucket/newbucket.cxx

index 6b7cd82eb295461ea3c46ff83845e9906892f888..d948932b7869e9867322e738442cb950f41d665b 100644 (file)
@@ -102,12 +102,7 @@ SGBucket::SGBucket(const long int bindex) {
  */
 static int floorWithEpsilon(double x)
 {
-    double diff = x - static_cast<int>(x);
-    if ( (x >= 0.0) || (fabs(diff) < SG_EPSILON) ) {
-        return static_cast<int>(x);
-    } else {
-        return static_cast<int>(x) - 1;
-    }
+    return static_cast<int>(floor(x + SG_EPSILON));
 }
 
 #ifndef NO_DEPRECATED_API
@@ -152,7 +147,7 @@ void SGBucket::innerSet( double dlon, double dlat )
         /* We have more than one tile per degree of
          * longitude, so we need an x offset.
          */
-        x = (int)((dlon - lon) / span);
+        x = floorWithEpsilon((dlon - lon) / span);
     } else {
         /* We have one or more degrees per tile,
          * so we need to find the base longitude
@@ -185,7 +180,7 @@ void SGBucket::innerSet( double dlon, double dlat )
         /* Latitude base and offset are easier, as
          * tiles always are 1/8 degree of latitude wide.
          */
-        y = (int)((dlat - lat) * 8);
+        y = floorWithEpsilon((dlat - lat) * 8);
     }
 }