point-octree/Data/Octree/BoundingBox ============================== BoundingBox.hs provides a generalized traversal function, that traverses an `Octree a` based on a BBox3 value. Here is an example that produces an `Octree Int` with 2 subdivisions, and finds the bounding box of a particular `(Vector3,Int)`. ~~~ {.haskell} module Main where import Data.List import Data.Maybe import Data.Vector.Class import System.Random import System.Random.Shuffle import Data.BoundingBox.B3 import Data.Octree.Internal hiding (lookup) import Data.Octree.BoundingBox.BoundingBox import Data.Octree.BoundingBox.Internal main = do octree' <- octree 513 let (testInput,_) = (!!) (toList octree') 256 (bbx,_) = traverseOctreeBB defBBoxConfig bbis octree' testInput putStrLn ("Bounding box of " ++ (show testInput) ++ " is " ++ (show bbx)) bbis :: BBox3 bbis = let infinity = (read "Infinity") :: Double swdCorner = Vector3 (-infinity) (-infinity) (-infinity) neuCorner = Vector3 (infinity) (infinity) (infinity) in bound_corners swdCorner neuCorner octree :: Integer -> IO (Octree DefNodeValue) octree bound = do xGen <- newStdGen yGen <- newStdGen zGen <- newStdGen let xPoints :: [Double] yPoints :: [Double] zPoints :: [Double] xPoints = map fromInteger $ shuffle' pointList (length pointList) xGen yPoints = map fromInteger $ shuffle' pointList (length pointList) yGen zPoints = map fromInteger $ shuffle' pointList (length pointList) zGen ub = bound `div` 2 lb = - (bound `div` 2) pointList = [lb .. ub] sizePL = length pointList vectors = map (\(x,y,z) -> Vector3 x y z) $ zip3 xPoints yPoints zPoints return $ fromList $ zip vectors $ [1 .. sizePL] ~~~