algebraic-0.1.0.0: src/Math/Coordinate/BiPolar.hs
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE OverlappingInstances #-}
module Math.Coordinate.BiPolar where
import qualified Math.Coordinate.Cartesian as Cartesian
import Math.Coordinate.Cartesian (Cartesian)
import Math.Coordinate.Coordinate (CoordConversion(..), ManualConversion(..), convertCoord)
import Math.Space.Space (Space2)
data BiPolar a = BiPolar !a deriving (Show)
data Point a = Point { a :: !a
, sigma :: !a
, tau :: !a
} deriving (Show)
toBiPolar = convertCoord . BiPolar
--------------------------------------------------------------------------------
-- Instances
--------------------------------------------------------------------------------
instance Floating a => CoordConversion ManualConversion Cartesian space (Point a) (Cartesian.Point2 a) where
convertCoordBase _ _ _ (Point a sigma tau) = Cartesian.Point2 x y where
x = a * (sinh tau) / (cosh tau - cos sigma)
y = a * (sin sigma) / (cosh tau - cos sigma)
instance (a~b) => CoordConversion ManualConversion (BiPolar b) space (Cartesian.Point2 a) (Point a) where
convertCoordBase _ _ _ (Cartesian.Point2 x y) = undefined