X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FCube.hs;h=301128116eb0f9127c5e5012fb5b0a4c9f5552df;hb=68b7d1002448a896236050caceb4f38463b996f4;hp=d0276c8277062ee3c0a360e6a228dbb32bd1b40d;hpb=89b8b6e94fcc944a1f4611811265f3c6217af850;p=spline3.git diff --git a/src/Cube.hs b/src/Cube.hs index d0276c8..3011281 100644 --- a/src/Cube.hs +++ b/src/Cube.hs @@ -38,8 +38,7 @@ instance Show Cube where empty_cube :: Cube empty_cube = Cube empty_grid 0 0 0 0 --- TODO: The paper considers 'i' to be the front/back direction, --- whereas I have it in the left/right direction. + instance Gridded Cube where back c = cube_at (grid c) ((i c) + 1) (j c) (k c) down c = cube_at (grid c) (i c) (j c) ((k c) - 1) @@ -105,9 +104,9 @@ instance ThreeDimensional Cube where i' = fromIntegral (i c) :: Double j' = fromIntegral (j c) :: Double k' = fromIntegral (k c) :: Double - x = (delta * i') - y = (delta * j') - z = (delta * k') + x = delta * i' + y = delta * j' + z = delta * k' contains_point c p | (x_coord p) < (xmin c) = False @@ -146,10 +145,14 @@ instance Fractional Cube where fromRational q = empty_cube { datum = fromRational q } +-- | Constructs a cube, switching the x and z axes. reverse_cube :: Grid -> Int -> Int -> Int -> Double -> Cube -reverse_cube g k' j' i' datum' = Cube g i' j' k' datum' +reverse_cube g k' j' i' = Cube g i' j' k' +-- | Return the cube corresponding to the grid point i,j,k. The list +-- of cubes is stored as [z][y][x] but we'll be requesting it by +-- [x][y][z] so we flip the indices in the last line. cube_at :: Grid -> Int -> Int -> Int -> Cube cube_at g i' j' k' | i' >= length (function_values g) = Cube g i' j' k' 0 @@ -159,17 +162,29 @@ cube_at g i' j' k' | k' >= length (((function_values g) !! i') !! j') = Cube g i' j' k' 0 | k' < 0 = Cube g i' j' k' 0 | otherwise = - Cube g i' j' k' ((((function_values g) !! i') !! j') !! k') + (((cubes g) !! k') !! j') !! i' + -- These next three functions basically form a 'for' loop, looping -- through the xs, ys, and zs in that order. -cubes_from_values :: Grid -> Int -> Int -> [Double] -> [Cube] -cubes_from_values g i' j' vals = - zipWith (reverse_cube g i' j') [0..] vals - -cubes_from_planes :: Grid -> Int -> [[Double]] -> [[Cube]] -cubes_from_planes g i' planes = - zipWith (cubes_from_values g i') [0..] planes +-- | The cubes_from_values function will return a function that takes +-- a list of values and returns a list of cubes. It could just as +-- well be written to take the values as a parameter; the omission +-- of the last parameter is known as an eta reduce. +cubes_from_values :: Grid -> Int -> Int -> ([Double] -> [Cube]) +cubes_from_values g i' j' = + zipWith (reverse_cube g i' j') [0..] + +-- | The cubes_from_planes function will return a function that takes +-- a list of planes and returns a list of cubes. It could just as +-- well be written to take the planes as a parameter; the omission +-- of the last parameter is known as an eta reduce. +cubes_from_planes :: Grid -> Int -> ([[Double]] -> [[Cube]]) +cubes_from_planes g i' = + zipWith (cubes_from_values g i') [0..] + +-- | Takes a grid as an argument, and returns a three-dimensional list +-- of cubes centered on its grid points. cubes :: Grid -> [[[Cube]]] cubes g = zipWith (cubes_from_planes g) [0..] (function_values g)