]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Tetrahedron.hs
Speed up the Tetrahedron contains_point function by dropping the useless factor of...
[spline3.git] / src / Tetrahedron.hs
index 73ed58863595cab2da3bd8a4a0e98cd2f5f69ad4..95233e008bfa0efe4fb69f20a4485b52f8e53b20 100644 (file)
@@ -6,6 +6,7 @@ import Prelude hiding (LT)
 import Test.QuickCheck (Arbitrary(..), Gen)
 
 import Cardinal
+import Comparisons (nearly_ge)
 import FunctionValues
 import Misc (factorial)
 import Point
@@ -42,7 +43,28 @@ instance Show Tetrahedron where
 instance ThreeDimensional Tetrahedron where
     center t = ((v0 t) + (v1 t) + (v2 t) + (v3 t)) `scale` (1/4)
     contains_point t p =
-        (b0 t p) >= 0 && (b1 t p) >= 0 && (b2 t p) >= 0 && (b3 t p) >= 0
+      b0_unscaled `nearly_ge` 0 &&
+      b1_unscaled `nearly_ge` 0 &&
+      b2_unscaled `nearly_ge` 0 &&
+      b3_unscaled `nearly_ge` 0
+      where
+        -- Drop the useless division and volume calculation that we
+        -- would do if we used the regular b0,..b3 functions.
+        b0_unscaled :: Double
+        b0_unscaled = volume inner_tetrahedron
+          where inner_tetrahedron = t { v0 = p }
+
+        b1_unscaled :: Double
+        b1_unscaled = volume inner_tetrahedron
+          where inner_tetrahedron = t { v1 = p }
+
+        b2_unscaled :: Double
+        b2_unscaled = volume inner_tetrahedron
+          where inner_tetrahedron = t { v2 = p }
+
+        b3_unscaled :: Double
+        b3_unscaled = volume inner_tetrahedron
+          where inner_tetrahedron = t { v3 = p }
 
 
 polynomial :: Tetrahedron -> (RealFunction Point)