]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Tetrahedron.hs
Fix all orphan instances.
[spline3.git] / src / Tetrahedron.hs
index 85ac4a372d222cea1eaa56a821f54cf340e08b82..eefbe118274993c166001733e42fc196187d90d7 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,
@@ -217,8 +236,8 @@ vol_matrix t = (4><4)
       z3 = z_coord (v2 t)
       z4 = z_coord (v3 t)
 
--- Computed using the formula from Lai & Schumaker, Definition 15.4,
--- page 436.
+-- Computed using the formula from Lai & Schumaker, Definition 15.4,
+--   page 436.
 volume :: Tetrahedron -> Double
 volume t
        | (v0 t) == (v1 t) = 0
@@ -230,21 +249,28 @@ volume t
        | otherwise = (1/6)*(det (vol_matrix t))
 
 
+-- | The barycentric coordinates of a point with respect to v0.
 b0 :: Tetrahedron -> (RealFunction Point)
 b0 t point = (volume inner_tetrahedron) / (volume t)
              where
                inner_tetrahedron = t { v0 = point }
 
+
+-- | The barycentric coordinates of a point with respect to v1.
 b1 :: Tetrahedron -> (RealFunction Point)
 b1 t point = (volume inner_tetrahedron) / (volume t)
              where
                inner_tetrahedron = t { v1 = point }
 
+
+-- | The barycentric coordinates of a point with respect to v2.
 b2 :: Tetrahedron -> (RealFunction Point)
 b2 t point = (volume inner_tetrahedron) / (volume t)
              where
                inner_tetrahedron = t { v2 = point }
 
+
+-- | The barycentric coordinates of a point with respect to v3.
 b3 :: Tetrahedron -> (RealFunction Point)
 b3 t point = (volume inner_tetrahedron) / (volume t)
              where