instance ThreeDimensional Tetrahedron where
center t = ((v0 t) + (v1 t) + (v2 t) + (v3 t)) `scale` (1/4)
contains_point t p =
- (b0 t p) `nearly_ge` 0 &&
- (b1 t p) `nearly_ge` 0 &&
- (b2 t p) `nearly_ge` 0 &&
- (b3 t p) `nearly_ge` 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)