{-|
Module: Data.Astro.CelestialObject
Description: Computations characteristics of selestial objects
Copyright: Alexander Ignatyev, 2016

Computations characteristics of selestial objects.
-}

module Data.Astro.CelestialObject
(
   angleEquatorial
  , angleEcliptic
)

where

import Data.Astro.Types (DecimalDegrees, toRadians, fromRadians, fromDecimalHours)
import Data.Astro.Coordinate (EquatorialCoordinates1(..), EclipticCoordinates(..))


-- | Calculate angle between two celestial objects

-- whose coordinates specified in Equatorial Coordinate System.

angleEquatorial :: EquatorialCoordinates1 -> EquatorialCoordinates1 -> DecimalDegrees
angleEquatorial :: EquatorialCoordinates1 -> EquatorialCoordinates1 -> DecimalDegrees
angleEquatorial (EC1 DecimalDegrees
delta1 DecimalHours
alpha1) (EC1 DecimalDegrees
delta2 DecimalHours
alpha2) =
  (DecimalDegrees, DecimalDegrees)
-> (DecimalDegrees, DecimalDegrees) -> DecimalDegrees
calcAngle (DecimalDegrees
delta1, DecimalHours -> DecimalDegrees
fromDecimalHours DecimalHours
alpha1) (DecimalDegrees
delta2, DecimalHours -> DecimalDegrees
fromDecimalHours DecimalHours
alpha2)


-- | Calculate angle between two celestial objects

-- whose coordinates specified in Ecliptic Coordinate System.

angleEcliptic :: EclipticCoordinates -> EclipticCoordinates -> DecimalDegrees
angleEcliptic :: EclipticCoordinates -> EclipticCoordinates -> DecimalDegrees
angleEcliptic (EcC DecimalDegrees
beta1 DecimalDegrees
lambda1) (EcC DecimalDegrees
beta2 DecimalDegrees
lambda2) =
  (DecimalDegrees, DecimalDegrees)
-> (DecimalDegrees, DecimalDegrees) -> DecimalDegrees
calcAngle (DecimalDegrees
beta1, DecimalDegrees
lambda1) (DecimalDegrees
beta2, DecimalDegrees
lambda2)


calcAngle :: (DecimalDegrees, DecimalDegrees) -> (DecimalDegrees, DecimalDegrees) -> DecimalDegrees
calcAngle :: (DecimalDegrees, DecimalDegrees)
-> (DecimalDegrees, DecimalDegrees) -> DecimalDegrees
calcAngle (DecimalDegrees
up1, DecimalDegrees
round1) (DecimalDegrees
up2, DecimalDegrees
round2) =
  let up1' :: Double
up1' = DecimalDegrees -> Double
toRadians DecimalDegrees
up1
      round1' :: Double
round1' = DecimalDegrees -> Double
toRadians DecimalDegrees
round1
      up2' :: Double
up2' = DecimalDegrees -> Double
toRadians DecimalDegrees
up2
      round2' :: Double
round2' = DecimalDegrees -> Double
toRadians DecimalDegrees
round2
      d :: Double
d = Double -> Double
forall a. Floating a => a -> a
acos (Double -> Double) -> Double -> Double
forall a b. (a -> b) -> a -> b
$ (Double -> Double
forall a. Floating a => a -> a
sin Double
up1')Double -> Double -> Double
forall a. Num a => a -> a -> a
*(Double -> Double
forall a. Floating a => a -> a
sin Double
up2') Double -> Double -> Double
forall a. Num a => a -> a -> a
+ (Double -> Double
forall a. Floating a => a -> a
cos Double
up1')Double -> Double -> Double
forall a. Num a => a -> a -> a
*(Double -> Double
forall a. Floating a => a -> a
cos Double
up2')Double -> Double -> Double
forall a. Num a => a -> a -> a
*Double -> Double
forall a. Floating a => a -> a
cos(Double
round1'Double -> Double -> Double
forall a. Num a => a -> a -> a
-Double
round2')
  in Double -> DecimalDegrees
fromRadians Double
d