blubber-server-0.0.1: src/Blubber/Server/Vector.hs
{-# LANGUAGE DeriveGeneric #-}
{- |
Module : $Header$
Description : The vector type and its operations.
Copyright : (c) plaimi 2015
License : AGPL-3
Maintainer : blubber@plaimi.net
-} module Blubber.Server.Vector where
import Data.Serialize
(
Serialize,
)
import GHC.Generics
(
Generic,
)
-- A simple vector type with an x and a y.
data Vector = Vec
{vx :: Double -- ^ The x position.
,vy :: Double -- ^ The y position.
} deriving (Eq, Generic, Show)
-- | 'Vector' uses a 'Serialize' instance to encode its data.
instance Serialize Vector
infixl 6 ^-^
(^-^) :: Vector -> Vector -> Vector
-- | 'Vector' subtraction.
(Vec x y) ^-^ (Vec x' y') = Vec (x - x') (y - y')
infixl 6 ^+^
-- | 'Vector' addition.
(^+^) :: Vector -> Vector -> Vector
(Vec x y) ^+^ (Vec x' y') = Vec (x + x') (y + y')
infixl 7 ^*^
-- | Multiply a 'Vector' with a scalar.
(^*^) :: Vector -> Double -> Vector
(Vec x y) ^*^ n = Vec (n * x) (n * y)
infixl 7 ^/^
-- | Divide a 'Vector' by a scalar.
(^/^) :: Vector -> Double -> Vector
(Vec x y) ^/^ n = Vec (n / x) (n / y)
magVec :: Vector -> Double
-- | Calculate the magnitude of a 'Vector'.
magVec (Vec x y) = sqrt (x * x + y * y)
vecLimitMag :: Double -> Vector -> Vector
-- | Limit the magnitude of a 'Vector' to a scalar.
vecLimitMag m v | magVec v > m = v ^*^ (m / magVec v)
| otherwise = v