import Test.QuickCheck (Arbitrary(..), Gen)
import Cardinal
+import Comparisons (nearly_ge)
import FunctionValues
import Misc (factorial)
import Point
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)