]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Tetrahedron.hs
Begin writing the precomputed_volume feature again.
[spline3.git] / src / Tetrahedron.hs
index eefbe118274993c166001733e42fc196187d90d7..eef16566352fdcaedf7d2f0455d65b05a29a8c68 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
@@ -16,7 +17,8 @@ data Tetrahedron = Tetrahedron { fv :: FunctionValues,
                                  v0 :: Point,
                                  v1 :: Point,
                                  v2 :: Point,
-                                 v3 :: Point }
+                                 v3 :: Point,
+                                 precomputed_volume :: Double }
                    deriving (Eq)
 
 
@@ -27,7 +29,8 @@ instance Arbitrary Tetrahedron where
       rnd_v2 <- arbitrary :: Gen Point
       rnd_v3 <- arbitrary :: Gen Point
       rnd_fv <- arbitrary :: Gen FunctionValues
-      return (Tetrahedron rnd_fv rnd_v0 rnd_v1 rnd_v2 rnd_v3)
+      rnd_vol <- arbitrary :: Gen Double
+      return (Tetrahedron rnd_fv rnd_v0 rnd_v1 rnd_v2 rnd_v3 rnd_vol)
 
 
 instance Show Tetrahedron where
@@ -42,7 +45,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)
@@ -223,18 +247,10 @@ vol_matrix t = (4><4)
                 y1, y2, y3, y4,
                 z1, z2, z3, z4 ]
     where
-      x1 = x_coord (v0 t)
-      x2 = x_coord (v1 t)
-      x3 = x_coord (v2 t)
-      x4 = x_coord (v3 t)
-      y1 = y_coord (v0 t)
-      y2 = y_coord (v1 t)
-      y3 = y_coord (v2 t)
-      y4 = y_coord (v3 t)
-      z1 = z_coord (v0 t)
-      z2 = z_coord (v1 t)
-      z3 = z_coord (v2 t)
-      z4 = z_coord (v3 t)
+      (x1, y1, z1) = v0 t
+      (x2, y2, z2) = v1 t
+      (x3, y3, z3) = v2 t
+      (x4, y4, z4) = v3 t
 
 -- | Computed using the formula from Lai & Schumaker, Definition 15.4,
 --   page 436.