X-Git-Url: https://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FFunctionValues.hs;h=28f596b618e5dcd3c3c8acfb92103c2208691818;hb=58cf11569acb270995d2de924dda03ef526647e2;hp=e8bdcb8e2d1f294216d38fa24d3b56fcc4cba786;hpb=f07f76b231a3df623aab8b6035ac6000ce2a5eb2;p=spline3.git diff --git a/src/FunctionValues.hs b/src/FunctionValues.hs index e8bdcb8..28f596b 100644 --- a/src/FunctionValues.hs +++ b/src/FunctionValues.hs @@ -1,3 +1,5 @@ +-- | The FunctionValues module contains the 'FunctionValues' type and +-- the functions used to manipulate it. module FunctionValues where @@ -5,6 +7,9 @@ import Prelude hiding (LT) import Cardinal +-- | The FunctionValues type represents the value of our function f at +-- the 27 points surrounding the center of a cube. Each value of f +-- can be accessed by the name of its direction. data FunctionValues = FunctionValues { front :: Double, back :: Double, @@ -35,10 +40,17 @@ data FunctionValues = interior :: Double } deriving (Eq, Show) +-- | Return a 'FunctionValues' with a bunch of zeros for data points. empty_values :: FunctionValues empty_values = FunctionValues 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +-- | The eval function is where the magic happens for the +-- FunctionValues type. Given a 'Cardinal' direction and a +-- 'FunctionValues' object, eval will return the value of the +-- function f in that 'Cardinal' direction. Note that 'Cardinal' can +-- be a composite type; eval is what performs the "arithmetic" on +-- 'Cardinal' directions. eval :: FunctionValues -> Cardinal -> Double eval f F = front f eval f B = back f @@ -73,6 +85,9 @@ eval f (Difference x y) = (eval f x) - (eval f y) eval f (Product x y) = (eval f x) * (eval f y) eval f (Quotient x y) = (eval f x) / (eval f y) +-- | Takes a three-dimensional list of 'Double' and a set of 3D +-- coordinates (i,j,k), and returns the value at (i,j,k) in the +-- supplied list. If there is no such value, zero is returned. value_at :: [[[Double]]] -> Int -> Int -> Int -> Double value_at values i j k | i < 0 = 0 @@ -83,6 +98,10 @@ value_at values i j k | length ((values !! k) !! j) <= i = 0 | otherwise = ((values !! k) !! j) !! i + +-- | Given a three-dimensional list of 'Double' and a set of 3D +-- coordinates (i,j,k), constructs and returns the 'FunctionValues' +-- object centered at (i,j,k) make_values :: [[[Double]]] -> Int -> Int -> Int -> FunctionValues make_values values i j k = empty_values { front = value_at values (i-1) j k, @@ -113,6 +132,10 @@ make_values values i j k = back_right_top = value_at values (i+1) (j+1) (k+1), interior = value_at values i j k } +-- | Takes a 'FunctionValues' and a function that transforms one +-- 'Cardinal' to another (called a rotation). Then it applies the +-- rotation to each element of the 'FunctionValues' object, and +-- returns the result. rotate :: FunctionValues -> (Cardinal -> Cardinal) -> FunctionValues rotate fv rotation = FunctionValues { front = eval fv (rotation F),