]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Grid.hs
Fix all orphan instances.
[spline3.git] / src / Grid.hs
index e45a0f4380946f281533f27dcc9745ac8f3e4ce9..efa63418947c308e7bed8c25619dadbc8d9d0a8e 100644 (file)
@@ -4,8 +4,14 @@
 module Grid
 where
 
+import Test.QuickCheck (Arbitrary(..), Gen, Positive(..))
+
 import Cube (Cube(Cube))
 import FunctionValues
+import Misc (flatten)
+import Point (Point)
+import ThreeDimensional (contains_point)
+
 
 -- | 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
@@ -16,6 +22,13 @@ data Grid = Grid { h :: Double, -- MUST BE GREATER THAN ZERO!
           deriving (Eq, Show)
 
 
+instance Arbitrary Grid where
+    arbitrary = do
+      (Positive h') <- arbitrary :: Gen (Positive Double)
+      fvs <- arbitrary :: Gen [[[Double]]]
+      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
@@ -58,3 +71,13 @@ cube_at g i j k
     | j >= length ((cubes g) !! i) = Nothing
     | k >= length (((cubes g) !! i) !! j) = Nothing
     | otherwise = Just $ (((cubes g) !! i) !! j) !! k
+
+
+-- | Takes a 'Grid', and returns all 'Cube's belonging to it that
+--   contain the given 'Point'.
+find_containing_cubes :: Grid -> Point -> [Cube]
+find_containing_cubes g p =
+    filter contains_our_point all_cubes
+    where
+      all_cubes = flatten $ cubes g
+      contains_our_point = flip contains_point p