algebraic-0.1.0.0: src/Math/Coordinate/Parabolic.hs
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE OverlappingInstances #-}
module Math.Coordinate.Parabolic 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 Parabolic = Parabolic deriving (Show)
data Point a = Point { rho :: !a
, tau :: !a
} deriving (Show)
toParabolic = convertCoord Parabolic
--------------------------------------------------------------------------------
-- Instances
--------------------------------------------------------------------------------
instance Floating a => CoordConversion ManualConversion Cartesian space (Point a) (Cartesian.Point2 a) where
convertCoordBase _ _ _ (Point rho tau) = Cartesian.Point2 x y where
x = rho * tau
y = (rho**2 - tau**2)/2
instance Floating a => CoordConversion ManualConversion Parabolic space (Cartesian.Point2 a) (Point a) where
convertCoordBase _ _ _ (Cartesian.Point2 x y) = Point rho tau
where rho = sqrt $ y + (sqrt $ x**2 + y**2)
tau = x/rho