From 6f592f0d0b6cadadbef112e294de449bd23edae0 Mon Sep 17 00:00:00 2001 From: Chris Wu Date: Sat, 14 Apr 2012 22:06:40 -0400 Subject: [PATCH] Readded vector --- Vector.hs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 Vector.hs diff --git a/Vector.hs b/Vector.hs new file mode 100644 index 0000000..7f153c3 --- /dev/null +++ b/Vector.hs @@ -0,0 +1,32 @@ +data Vector = V !Double !Double !Double deriving (Eq, Show) + +instance Num Vector where + (V x y z) + (V a b c) = V (x+a) (y+b) (z+c) + (V x y z) - (V a b c) = V (x-a) (y-b) (z-c) + (V x y z) * (V a b c) = V (y * c - z * b) (z * a - x * c) (x * b - y * a) + negate = scale (-1) + abs _ = error "abs Vector not impelemented" + signum _ = error "signum Vector not implemented" + fromInteger _ = error "fromInteger Vector not impelmented" + +dot :: Vector -> Vector -> Double +dot (V x y z) (V a b c) = x * a + y * b + z * c + +sqrMag :: Vector -> Double +sqrMag v = v `dot` v + +mag :: Vector -> Double +mag = sqrt . sqrMag + +projMag :: Vector -> Vector -> Double +projMag v u = (v `dot` u) / mag u + +scale :: Double -> Vector -> Vector +scale s (V x y z) = V (x*s) (y*s) (z*s) + +norm :: Vector -> Vector +norm (V 0 0 0) = V 0 0 0 +norm v = scale (1 / mag v) v + +proj :: Vector -> Vector -> Vector +proj v u = scale ((v `dot` u) / sqrMag u) u