module Vector where import Graphics.UI.GLUT data V3 = V3 {-# UNPACK #-} !GLdouble {-# UNPACK #-} !GLdouble {-# UNPACK #-} !GLdouble deriving (Show, Eq) normalize :: V3 -> V3 normalize (V3 x y z) = V3 (x/d) (y/d) (z/d) where d = sqrt (x*x+y*y+z*z) prod (V3 x1 y1 z1) (V3 x2 y2 z2) = V3 (y1 * z2 - z1 * y2) (z1 * x2 - x1 * z2) (x1 * y2 - y1 * x2) xmove (V3 x y z) incr = V3 (x+incr) y z ymove (V3 x y z) incr = V3 x (y+incr) z zmove (V3 x y z) incr = V3 x y (z+incr) xpart (V3 x _ _) = x ypart (V3 _ y _) = y zpart (V3 _ _ z) = z instance Num V3 where (V3 x1 y1 z1) + (V3 x2 y2 z2) = V3 (x1 + x2) (y1 + y2) (z1 + z2) (V3 x1 y1 z1) * (V3 x2 y2 z2) = V3 (y1 * z2 - z1 * y2) (z1 * x2 - x1 * z2) (x1 * y2 - y1 * x2) (V3 x1 y1 z1) - (V3 x2 y2 z2) = V3 (x1 - x2) (y1 - y2) (z1 - z2) negate (V3 x y z) = V3 (-x) (-y) (-z) -- dummy definitions abs v = v signum (V3 0 0 0) = 0 signum _ = 1