packages feed

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