hasufell
46377164b4
Don't rely on Data.Vector.V2 and friend anymore, but use the types we have from Diagrams already and enhance them.
76 lines
1.8 KiB
Haskell
76 lines
1.8 KiB
Haskell
{-# OPTIONS_HADDOCK ignore-exports #-}
|
|
|
|
module LinearAlgebra.Vector where
|
|
|
|
import Diagrams.TwoD.Types
|
|
|
|
type Vec = R2
|
|
type PT = P2
|
|
type Coord = (Double, Double)
|
|
|
|
|
|
-- |Checks whether the Point is in a given dimension.
|
|
inRange :: Coord -- ^ X dimension
|
|
-> Coord -- ^ Y dimension
|
|
-> PT -- ^ Coordinates
|
|
-> Bool -- ^ result
|
|
inRange (xlD, xuD) (ylD, yuD) p
|
|
= x <= xuD && x >= xlD && y <= yuD && y >= ylD
|
|
where
|
|
(x, y) = unp2 p
|
|
|
|
|
|
-- |Get the angle between two vectors in degrees.
|
|
getAngle :: Vec -> Vec -> Double
|
|
getAngle a b = acos .
|
|
flip (/) (vecLength a * vecLength b) .
|
|
scalarProd a $
|
|
b
|
|
|
|
|
|
-- |Get the length of a vector.
|
|
vecLength :: Vec -> Double
|
|
vecLength v = sqrt (x^2 + y^2)
|
|
where
|
|
(x, y) = unr2 v
|
|
|
|
|
|
-- |Compute the scalar product of two vectors.
|
|
scalarProd :: Vec -> Vec -> Double
|
|
scalarProd v1 v2 = a1 * b1 + a2 * b2
|
|
where
|
|
(a1, a2) = unr2 v1
|
|
(b1, b2) = unr2 v2
|
|
|
|
|
|
-- |Construct a vector that points to a point from the origin.
|
|
pt2Vec :: PT -> Vec
|
|
pt2Vec = r2 . unp2
|
|
|
|
|
|
-- |Give the point which is at the coordinates the vector
|
|
-- points to from the origin.
|
|
vec2Pt :: Vec -> PT
|
|
vec2Pt = p2 . unr2
|
|
|
|
|
|
-- |Construct a vector between two points.
|
|
vp2 :: PT -- ^ vector origin
|
|
-> PT -- ^ vector points here
|
|
-> Vec
|
|
vp2 a b = (pt2Vec b) - (pt2Vec a)
|
|
|
|
|
|
-- |Checks if 3 points a,b,c build a counterclock wise triangle by
|
|
-- connecting a-b-c. This is done by computing thed determinant and
|
|
-- checking the algebraic sign.
|
|
ccw :: PT -> PT -> PT -> Bool
|
|
ccw a b c = (bx - ax) *
|
|
(cy - ay) -
|
|
(by - ay) *
|
|
(cx - ax) >= 0
|
|
where
|
|
(ax, ay) = unp2 a
|
|
(bx, by) = unp2 b
|
|
(cx, cy) = unp2 c
|