module VectorMaps ( vectorElementX ,vectorElementY ,vectorAdd ,vectorSubtract ,vectorScalar ,vectorNorm ,vectorNorml1 ,vectorMaxNorm ,vectorNomalize ,vectorInnerProduct ,vectorTypeChange --,vectorCompare ,vectorScalarElements ) where import Graphics.Rendering.OpenGL import Control.Applicative import States ------ベクトル成分を抜き取り vectorElementX :: (Vector2 a) -> a vectorElementX (Vector2 x y) = x ------ベクトル成分を抜き取り vectorElementY :: (Vector2 a) -> a vectorElementY (Vector2 x y) = y -----ベクトルの加法 vectorAdd :: (Num a) => (Vector2 a) -> (Vector2 a) -> (Vector2 a) vectorAdd u v = (+) <$> u <*> v -----ベクトルの減算 vectorSubtract :: (Num a) => (Vector2 a) -> (Vector2 a) -> (Vector2 a) vectorSubtract u v = (-) <$> u <*> v -----スカラー倍 vectorScalar :: GLfloat -> (Vector2 GLfloat) -> (Vector2 GLfloat) vectorScalar a (Vector2 x y) = (Vector2 (a * x) (a * y)) -----ベクトルのノルム vectorNorm :: (Vector2 GLfloat) -> GLfloat vectorNorm (Vector2 x y) = sqrt (x^2 + y^2) -----ベクトルのl1ノルム vectorNorml1 :: (Num a) => (Vector2 a) -> a vectorNorml1 (Vector2 x y) = (abs x) + (abs y) ------ベクトルのMaxノルム vectorMaxNorm :: (Num a , Ord a) => (Vector2 a) -> a vectorMaxNorm (Vector2 x y) = max (abs x) (abs y) -----ベクトルの正規化 vectorNomalize :: (Vector2 Float) -> (Vector2 Float) vectorNomalize v = vectorScalar (1 / vectorNorm v) v -----ベクトルの内積 vectorInnerProduct :: Num a => (Vector2 a) -> (Vector2 a) -> a vectorInnerProduct (Vector2 a b ) (Vector2 x y ) = a * x + b * y ------ベクトルの型変換 vectorTypeChange :: (Vector2 GLint) -> (Vector2 GLfloat) vectorTypeChange v = fmap realToFrac v ------べクトルの比較 --vectorCompare :: (Num a , Eq a) => (Vector2 a) -> (Vector2 a) -> Bool --vectorCompare (Vector2 x y) (Vector2 a b) = ((x == a) && (y == b) ) ------ベクトルの成分の変換 vectorScalarElements :: (Num a) => (a ,a) -> (Vector2 a) -> (Vector2 a) vectorScalarElements (s , t) (Vector2 x y) = (Vector2 (s * x) (t * y))