]> gitweb.michael.orlitzky.com - spline3.git/blobdiff - src/Cube.hs
Define a custom 'Point' type instead of a 3-tuple so that its constructor can be...
[spline3.git] / src / Cube.hs
index 1c654ffd72763010bbb56352022160f61a0257c6..3c82f67e285f611ba64a11092d61c86cc890724a 100644 (file)
@@ -27,7 +27,7 @@ import Comparisons ((~=), (~~=))
 import qualified Face (Face(Face, v0, v1, v2, v3))
 import FunctionValues (FunctionValues, eval, rotate)
 import Misc (all_equal, disjoint)
-import Point
+import Point (Point(..), dot)
 import Tetrahedron (Tetrahedron(..), c, volume)
 import ThreeDimensional
 
@@ -125,7 +125,7 @@ zmax cube = (k' + 1/2)*delta
 instance ThreeDimensional Cube where
     -- | The center of Cube_ijk coincides with v_ijk at
     --   (ih, jh, kh). See Sorokina and Zeilfelder, p. 76.
-    center cube = (x, y, z)
+    center cube = Point x y z
            where
              delta = h cube
              i' = fromIntegral (i cube) :: Double
@@ -137,7 +137,7 @@ instance ThreeDimensional Cube where
 
     -- | It's easy to tell if a point is within a cube; just make sure
     --   that it falls on the proper side of each of the cube's faces.
-    contains_point cube (x, y, z)
+    contains_point cube (Point x y z)
         | x < (xmin cube) = False
         | x > (xmax cube) = False
         | y < (ymin cube) = False
@@ -156,10 +156,10 @@ top_face cube = Face.Face v0' v1' v2' v3'
     where
       delta = (1/2)*(h cube)
       cc  = center cube
-      v0' = cc + (delta, -delta, delta)
-      v1' = cc + (delta, delta, delta)
-      v2' = cc + (-delta, delta, delta)
-      v3' = cc + (-delta, -delta, delta)
+      v0' = cc + ( Point delta (-delta) delta )
+      v1' = cc + ( Point delta delta delta )
+      v2' = cc + ( Point (-delta) delta delta )
+      v3' = cc + ( Point (-delta) (-delta) delta )
 
 
 
@@ -169,10 +169,10 @@ back_face cube = Face.Face v0' v1' v2' v3'
     where
       delta = (1/2)*(h cube)
       cc  = center cube
-      v0' = cc + (delta, -delta, -delta)
-      v1' = cc + (delta, delta, -delta)
-      v2' = cc + (delta, delta, delta)
-      v3' = cc + (delta, -delta, delta)
+      v0' = cc + ( Point delta (-delta) (-delta) )
+      v1' = cc + ( Point delta delta (-delta) )
+      v2' = cc + ( Point delta delta delta )
+      v3' = cc + ( Point delta (-delta) delta )
 
 
 -- The bottom face (in the direction of -z) of the cube.
@@ -181,10 +181,10 @@ down_face cube = Face.Face v0' v1' v2' v3'
     where
       delta = (1/2)*(h cube)
       cc  = center cube
-      v0' = cc + (-delta, -delta, -delta)
-      v1' = cc + (-delta, delta, -delta)
-      v2' = cc + (delta, delta, -delta)
-      v3' = cc + (delta, -delta, -delta)
+      v0' = cc + ( Point (-delta) (-delta) (-delta) )
+      v1' = cc + ( Point (-delta) delta (-delta) )
+      v2' = cc + ( Point delta delta (-delta) )
+      v3' = cc + ( Point delta (-delta) (-delta) )
 
 
 
@@ -194,10 +194,10 @@ front_face cube = Face.Face v0' v1' v2' v3'
     where
       delta = (1/2)*(h cube)
       cc  = center cube
-      v0' = cc + (-delta, -delta, delta)
-      v1' = cc + (-delta, delta, delta)
-      v2' = cc + (-delta, delta, -delta)
-      v3' = cc + (-delta, -delta, -delta)
+      v0' = cc + ( Point (-delta) (-delta) delta )
+      v1' = cc + ( Point (-delta) delta delta )
+      v2' = cc + ( Point (-delta) delta (-delta) )
+      v3' = cc + ( Point (-delta) (-delta) (-delta) )
 
 -- | The left (in the direction of -y) face of the cube.
 left_face :: Cube -> Face.Face
@@ -205,10 +205,10 @@ left_face cube = Face.Face v0' v1' v2' v3'
     where
       delta = (1/2)*(h cube)
       cc  = center cube
-      v0' = cc + (delta, -delta, delta)
-      v1' = cc + (-delta, -delta, delta)
-      v2' = cc + (-delta, -delta, -delta)
-      v3' = cc + (delta, -delta, -delta)
+      v0' = cc + ( Point delta (-delta) delta )
+      v1' = cc + ( Point (-delta) (-delta) delta )
+      v2' = cc + ( Point (-delta) (-delta) (-delta) )
+      v3' = cc + ( Point delta (-delta) (-delta) )
 
 
 -- | The right (in the direction of y) face of the cube.
@@ -217,10 +217,10 @@ right_face cube = Face.Face v0' v1' v2' v3'
     where
       delta = (1/2)*(h cube)
       cc  = center cube
-      v0' = cc + (-delta, delta, delta)
-      v1' = cc + (delta, delta, delta)
-      v2' = cc + (delta, delta, -delta)
-      v3' = cc + (-delta, delta, -delta)
+      v0' = cc + ( Point (-delta) delta delta)
+      v1' = cc + ( Point delta  delta delta )
+      v2' = cc + ( Point delta delta (-delta) )
+      v3' = cc + ( Point (-delta) delta (-delta) )
 
 
 tetrahedron :: Cube -> Int -> Tetrahedron
@@ -588,14 +588,14 @@ back_right_down_tetrahedra  cube =
     (tetrahedron cube 18)
 
 in_top_half :: Cube -> Point -> Bool
-in_top_half cube (_,_,z) =
+in_top_half cube (Point _ _ z) =
   distance_from_top <= distance_from_bottom
   where
     distance_from_top = abs $ (zmax cube) - z
     distance_from_bottom = abs $ (zmin cube) - z
 
 in_front_half :: Cube -> Point -> Bool
-in_front_half cube (x,_,_) =
+in_front_half cube (Point x _ _) =
     distance_from_front <= distance_from_back
   where
     distance_from_front = abs $ (xmin cube) - x
@@ -603,7 +603,7 @@ in_front_half cube (x,_,_) =
 
 
 in_left_half :: Cube -> Point -> Bool
-in_left_half cube (_,y,_) =
+in_left_half cube (Point _ y _) =
     distance_from_left <= distance_from_right
   where
     distance_from_left = abs $ (ymin cube) - y