module Data.Geo.GreatCircle(
                             sphericalLaw
                           ) where

import Data.Geo.Sphere
import Data.Geo.Coord
import Data.Geo.Radians
import Data.Geo.Accessor.Lat
import Data.Geo.Accessor.Lon
import Data.Geo.Accessor.Value

sphericalLaw :: Sphere -> Coord -> Coord -> Double
sphericalLaw s start end = let lat1 = toRadians (lat start)
                               lat2 = toRadians (lat end)
                               lon1 = toRadians (lon start)
                               lon2 = toRadians (lon end)
                           in acos (sin lat1 * sin lat2 + cos lat1 * cos lat2 * cos (lon2 - lon1)) * value s