]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Tetrahedron.hs
Remove the x_coord, y_coord, and z_coord functions from Point.
[spline3.git] / src / Tetrahedron.hs
index 9d90f713e9e214897d13151295ac4599fa983ea4..73ed58863595cab2da3bd8a4a0e98cd2f5f69ad4 100644 (file)
@@ -3,6 +3,7 @@ where
 
 import Numeric.LinearAlgebra hiding (i, scale)
 import Prelude hiding (LT)
+import Test.QuickCheck (Arbitrary(..), Gen)
 
 import Cardinal
 import FunctionValues
@@ -18,6 +19,17 @@ data Tetrahedron = Tetrahedron { fv :: FunctionValues,
                                  v3 :: Point }
                    deriving (Eq)
 
+
+instance Arbitrary Tetrahedron where
+    arbitrary = do
+      rnd_v0 <- arbitrary :: Gen Point
+      rnd_v1 <- arbitrary :: Gen Point
+      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)
+
+
 instance Show Tetrahedron where
     show t = "Tetrahedron:\n" ++
              "  fv: " ++ (show (fv t)) ++ "\n" ++
@@ -76,6 +88,11 @@ beta t i j k l
     b3_term = (b3 t) `fexp` l
 
 
+-- | The coefficient function. c t i j k l returns the coefficient
+--   c_ijkl with respect to the tetrahedron t. The definition uses
+--   pattern matching to mimic the definitions given in Sorokina and
+--   Zeilfelder, pp. 84-86. If incorrect indices are supplied, the
+--   function will simply error.
 c :: Tetrahedron -> Int -> Int -> Int -> Int -> Double
 c t 0 0 3 0 = eval (fv t) $
               (1/8) * (I + F + L + T + LT + FL + FT + FLT)
@@ -197,6 +214,8 @@ c _ _ _ _ _ = error "coefficient index out of bounds"
 
 
 
+-- | The matrix used in the tetrahedron volume calculation as given in
+--   Lai & Schumaker, Definition 15.4, page 436.
 vol_matrix :: Tetrahedron -> Matrix Double
 vol_matrix t = (4><4)
                [1,  1,  1,  1,
@@ -204,18 +223,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.