-- | The Face module just contains the definition of the 'Face' data
-- type and its two typeclass instances.
-module Face
- ( Face(..) )
+module Face (
+ Face(..),
+ center
+ )
where
import Point
-import ThreeDimensional
-data Face = Face { v0 :: Point,
- v1 :: Point,
- v2 :: Point,
- v3 :: Point }
+data Face = Face { v0 :: !Point,
+ v1 :: !Point,
+ v2 :: !Point,
+ v3 :: !Point }
deriving (Eq)
instance Show Face where
- show f = "Face:\n" ++
- " v0: " ++ (show (v0 f)) ++ "\n" ++
- " v1: " ++ (show (v1 f)) ++ "\n" ++
- " v2: " ++ (show (v2 f)) ++ "\n" ++
- " v3: " ++ (show (v3 f)) ++ "\n"
+ show (Face v0' v1' v2' v3') =
+ "Face:\n" ++
+ " v0: " ++ (show v0') ++ "\n" ++
+ " v1: " ++ (show v1') ++ "\n" ++
+ " v2: " ++ (show v2') ++ "\n" ++
+ " v3: " ++ (show v3') ++ "\n"
--- | The 'Face' type is an instance of 'ThreeDimensional' so that we
--- can call the 'center' function on it. This is useful because the
--- center of a face is always a vertex of a tetrahedron.
-instance ThreeDimensional Face where
- -- | Since a face is square, we can just average the four vertices
- -- to find the center.
- center f = ((v0 f) + (v1 f) + (v2 f) + (v3 f)) `scale` (1/4)
-
- -- | It's possible to implement this, but it hasn't been done
- -- yet. A face will contain a point if the point lies in the same
- -- plane as the vertices of the face, and if it falls on the
- -- correct side of the four sides of the face.
- contains_point _ _ = False
+-- | Returns the center of the given face. Since a face is just
+-- square, we can average the four vertices to find its center. This
+-- is useful because the center of a face is always a vertex of a
+-- tetrahedron.
+center :: Face -> Point
+center (Face v0' v1' v2' v3') =
+ (v0' + v1' + v2' + v3') `scale` (1/4)