]> git.mxchange.org Git - simgear.git/commitdiff
Provide a more exact sphere/box test.
authorfrohlich <frohlich>
Sun, 2 May 2010 20:14:39 +0000 (20:14 +0000)
committerTim Moore <timoore33@gmail.com>
Wed, 5 May 2010 07:43:32 +0000 (09:43 +0200)
Modified Files:
simgear/math/SGIntersect.hxx simgear/math/SGBox.hxx

simgear/math/SGBox.hxx
simgear/math/SGIntersect.hxx

index 8024a1318e3911767828bcebf164a983fe36d573..dfa50275b3af0bc95d1036475db3cbad4df4c7d3 100644 (file)
@@ -71,6 +71,14 @@ public:
                      (pt[2] > center[2]) ? _min[2] : _max[2]);
   }
 
+  // return the closest point to pt still in the box
+  template<typename S>
+  SGVec3<T> getClosestPoint(const SGVec3<S>& pt) const
+  {
+    return SGVec3<T>((pt[0] < _min[0]) ? _min[0] : ((_max[0] < pt[0]) ? _max[0] : T(pt[0])),
+                     (pt[1] < _min[1]) ? _min[1] : ((_max[1] < pt[1]) ? _max[1] : T(pt[1])),
+                     (pt[2] < _min[2]) ? _min[2] : ((_max[2] < pt[2]) ? _max[2] : T(pt[2])));
+  }
 
   // Only works for floating point types
   SGVec3<T> getCenter() const
index 533bd2dc005db90668737ec250fdd1a64db4ead2..24741f6409bd78dcfeb603525aab6cbd0a474592 100644 (file)
@@ -38,25 +38,11 @@ intersects(const SGBox<T1>& box, const SGSphere<T2>& sphere)
 {
   if (sphere.empty())
     return false;
-  // Is more or less trivially included in the next tests
-  // if (box.empty())
-  //   return false;
-
-  if (sphere.getCenter().x() < box.getMin().x() - sphere.getRadius())
-    return false;
-  if (sphere.getCenter().y() < box.getMin().y() - sphere.getRadius())
-    return false;
-  if (sphere.getCenter().z() < box.getMin().z() - sphere.getRadius())
+  if (box.empty())
     return false;
 
-  if (box.getMax().x() + sphere.getRadius() < sphere.getCenter().x())
-    return false;
-  if (box.getMax().y() + sphere.getRadius() < sphere.getCenter().y())
-    return false;
-  if (box.getMax().z() + sphere.getRadius() < sphere.getCenter().z())
-    return false;
-
-  return true;
+  SGVec3<T1> closest = box.getClosestPoint(sphere.getCenter());
+  return distSqr(closest, SGVec3<T1>(sphere.getCenter())) <= sphere.getRadius2();
 }
 // make it symmetric
 template<typename T1, typename T2>