X-Git-Url: https://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FGrid.hs;h=1a01ab7eb60bba873e31e087b645eaf8d83a3689;hb=883ce9d78072c492000de94478189095032b6615;hp=63b2cfa122bc6ba5bbb9d496b77f1a00466eebb6;hpb=d341837e57bf39aa20fbeaf53ac4330478596b1c;p=spline3.git diff --git a/src/Grid.hs b/src/Grid.hs index 63b2cfa..1a01ab7 100644 --- a/src/Grid.hs +++ b/src/Grid.hs @@ -12,27 +12,27 @@ import Misc (flatten) import Point (Point) import Tetrahedron (polynomial) import ThreeDimensional (contains_point) - +import Values (Values3D, dims, empty3d) -- | Our problem is defined on a Grid. The grid size is given by the -- positive number h. The function values are the values of the -- function at the grid points, which are distance h from one -- another in each direction (x,y,z). data Grid = Grid { h :: Double, -- MUST BE GREATER THAN ZERO! - function_values :: [[[Double]]] } + function_values :: Values3D } deriving (Eq, Show) instance Arbitrary Grid where arbitrary = do (Positive h') <- arbitrary :: Gen (Positive Double) - fvs <- arbitrary :: Gen [[[Double]]] + fvs <- arbitrary :: Gen Values3D return (make_grid h' fvs) -- | The constructor that we want people to use. If we're passed a -- non-positive grid size, we throw an error. -make_grid :: Double -> [[[Double]]] -> Grid +make_grid :: Double -> Values3D -> Grid make_grid grid_size values | grid_size <= 0 = error "grid size must be positive" | otherwise = Grid grid_size values @@ -40,24 +40,21 @@ make_grid grid_size values -- | Creates an empty grid with grid size 1. empty_grid :: Grid -empty_grid = Grid 1 [[[]]] +empty_grid = Grid 1 empty3d -- | Returns a three-dimensional list of cubes centered on the grid -- points of g with the appropriate 'FunctionValues'. cubes :: Grid -> [[[Cube]]] cubes g - | fvs == [[[]]] = [[[]]] - | head fvs == [[]] = [[[]]] + | xsize == 0 || ysize == 0 || zsize == 0 = [[[]]] | otherwise = [[[ Cube (h g) i j k (make_values fvs i j k) | i <- [0..xsize]] | j <- [0..ysize]] | k <- [0..zsize]] where fvs = function_values g - zsize = (length fvs) - 1 - ysize = length (head fvs) - 1 - xsize = length (head $ head fvs) - 1 + (xsize, ysize, zsize) = dims fvs -- | Takes a grid and a position as an argument and returns the cube @@ -87,8 +84,7 @@ find_containing_cubes g p = zoom :: Grid -> Int -> [[[Double]]] zoom g scale_factor - | fvs == [[[]]] = [] - | head fvs == [[]] = [] + | xsize == 0 || ysize == 0 || zsize == 0 = [] | otherwise = [[[f p | i <- [0..scaled_zsize], let i' = scale_dimension i, @@ -105,6 +101,8 @@ zoom g scale_factor scale_dimension x = (fromIntegral x) / (fromIntegral scale_factor) fvs = function_values g - scaled_zsize = ((length fvs) - 1) * scale_factor - scaled_ysize = (length (head fvs) - 1) * scale_factor - scaled_xsize = (length (head $ head fvs) - 1) * scale_factor + (xsize, ysize, zsize) = dims fvs + scaled_xsize = xsize * scale_factor + scaled_ysize = ysize * scale_factor + scaled_zsize = zsize * scale_factor +