]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Grid.hs
Add a chunked version of zoom.
[spline3.git] / src / Grid.hs
index e4f3d62b9a661df068ec80e837fc9d7289734ea4..5ff4aa28ab95b4e3ad62c9798ccb836327d57164 100644 (file)
@@ -6,7 +6,8 @@ module Grid (
   grid_tests,
   make_grid,
   slow_tests,
-  zoom
+  zoom,
+  zoom_chunk
   )
 where
 
@@ -151,7 +152,8 @@ zoom_result g (sfx, sfy, sfz) (R.Z R.:. m R.:. n R.:. o) =
     cube = find_containing_cube g p
     t = find_containing_tetrahedron cube p
     f = polynomial t
-    
+
+
 zoom :: Grid -> ScaleFactor -> Values3D
 zoom g scale_factor
     | xsize == 0 || ysize == 0 || zsize == 0 = empty3d
@@ -165,6 +167,43 @@ zoom g scale_factor
 
 
 
+{-# INLINE zoom_chunk_lookup #-}
+zoom_chunk_lookup :: Grid -> ScaleFactor -> a -> (R.DIM3 -> Double)
+zoom_chunk_lookup g scale_factor _ =
+    zoom_chunk_result g scale_factor
+
+
+{-# INLINE zoom_chunk_result #-}
+zoom_chunk_result :: Grid -> ScaleFactor -> R.DIM3 -> Double
+zoom_chunk_result g (sfx, sfy, sfz) (R.Z R.:. m R.:. n R.:. o)
+  | m /= 1 = 0 -- We're going to drop these anyway.
+  | otherwise = f p
+    where
+      offset = (h g)/2
+      sfx' = fromIntegral sfx
+      sfy' = fromIntegral sfy
+      sfz' = fromIntegral sfz
+      m' = (fromIntegral m) / sfx' - offset
+      n' = (fromIntegral n) / sfy' - offset
+      o' = (fromIntegral o) / sfz' - offset
+      p  = (m', n', o') :: Point
+      cube = find_containing_cube g p
+      t = find_containing_tetrahedron cube p
+      f = polynomial t
+
+
+zoom_chunk :: Grid -> ScaleFactor -> Values3D
+zoom_chunk g scale_factor
+    | xsize == 0 || ysize == 0 || zsize == 0 = empty3d
+    | otherwise =
+        R.force $ R.unsafeTraverse arr transExtent (zoom_chunk_lookup g scale_factor)
+          where
+            arr = function_values g
+            (xsize, ysize, zsize) = dims arr
+            transExtent = zoom_shape scale_factor
+
+
+
 -- | Check all coefficients of tetrahedron0 belonging to the cube
 --   centered on (1,1,1) with a grid constructed from the trilinear
 --   values. See example one in the paper.