module Geometry.Flat.TwoD.Space
( Point(..)
, Geodesic(..)
) where
import Geometry.Class
import Geometry.Utils (fixAngle)
data Point = Point{ pX, pY :: !Double } deriving Show
data Geodesic = Geodesic{ gO :: !Point, gX, gY :: !Double } deriving Show
instance Geometry Point Geodesic where
distance (Point u v) (Point x y) =
let dx = x u
dy = y v
in sqrt (dx * dx + dy * dy)
angle (Point p q) (Point u v) (Point x y) =
let du = u p
dv = v q
dx = x p
dy = y q
uv = atan2 dv du
xy = atan2 dy dx
in fixAngle (xy uv)
geodesic p@(Point u v) (Point x y) =
let dx = x u
dy = y v
d = sqrt (dx * dx + dy * dy)
in Geodesic p (dx / d) (dy / d)
rotate a (Point u v) (Point x y) =
let co = cos a
si = sin a
p = x u
q = y v
in Point (u + co * p si * q) (v + si * p + co * q)
translate d (Geodesic _ dx dy) (Point x y) = Point (x + d * dx) (y + d * dy)
midpoint (Point u v) (Point x y) = Point (0.5 * (u + x)) (0.5 * (v + y))
instance Embedding Point Point where
embed = id
model = Just