X-Git-Url: http://gitweb.michael.orlitzky.com/?p=spline3.git;a=blobdiff_plain;f=src%2FTetrahedron.hs;h=75957291c4d37ce005448de53fb159785a73361a;hp=a6d69a2c68af2c8051d3fab76b9bcfd4e3201bfd;hb=5f01596d42cca3ec2b8236d697adb468cfcdb055;hpb=1bf996325008f79215a607d765adb042026f7444 diff --git a/src/Tetrahedron.hs b/src/Tetrahedron.hs index a6d69a2..7595729 100644 --- a/src/Tetrahedron.hs +++ b/src/Tetrahedron.hs @@ -5,7 +5,9 @@ module Tetrahedron ( b1, -- Cube test b2, -- Cube test b3, -- Cube test + barycenter, c, + contains_point, polynomial, tetrahedron_properties, tetrahedron_tests, @@ -30,7 +32,6 @@ import FunctionValues (FunctionValues(..), empty_values) import Misc (factorial) import Point (Point(..), scale) import RealFunction (RealFunction, cmult, fexp) -import ThreeDimensional (ThreeDimensional(..)) data Tetrahedron = Tetrahedron { function_values :: FunctionValues, @@ -67,34 +68,40 @@ instance Show Tetrahedron where " v3: " ++ (show (v3 t)) ++ "\n" -instance ThreeDimensional Tetrahedron where - center (Tetrahedron _ v0' v1' v2' v3' _) = - (v0' + v1' + v2' + v3') `scale` (1/4) - - -- contains_point is only used in tests. - contains_point t p0 = - b0_unscaled `nearly_ge` 0 && - b1_unscaled `nearly_ge` 0 && - b2_unscaled `nearly_ge` 0 && - b3_unscaled `nearly_ge` 0 +-- | Find the barycenter of the given tetrahedron. +-- We just average the four vertices. +barycenter :: Tetrahedron -> Point +barycenter (Tetrahedron _ v0' v1' v2' v3' _) = + (v0' + v1' + v2' + v3') `scale` (1/4) + +-- | A point is internal to a tetrahedron if all of its barycentric +-- coordinates with respect to that tetrahedron are non-negative. +contains_point :: Tetrahedron -> Point -> Bool +contains_point t p0 = + 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 - -- 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 = p0 } - - b1_unscaled :: Double - b1_unscaled = volume inner_tetrahedron - where inner_tetrahedron = t { v1 = p0 } - - b2_unscaled :: Double - b2_unscaled = volume inner_tetrahedron - where inner_tetrahedron = t { v2 = p0 } - - b3_unscaled :: Double - b3_unscaled = volume inner_tetrahedron - where inner_tetrahedron = t { v3 = p0 } + inner_tetrahedron = t { v0 = p0 } + + b1_unscaled :: Double + b1_unscaled = volume inner_tetrahedron + where inner_tetrahedron = t { v1 = p0 } + + b2_unscaled :: Double + b2_unscaled = volume inner_tetrahedron + where inner_tetrahedron = t { v2 = p0 } + + b3_unscaled :: Double + b3_unscaled = volume inner_tetrahedron + where inner_tetrahedron = t { v3 = p0 } + {-# INLINE polynomial #-} polynomial :: Tetrahedron -> (RealFunction Point)