33 lines
902 B
Haskell
33 lines
902 B
Haskell
import Text.Printf
|
|
import Control.Arrow ((***))
|
|
|
|
-- The haversine of an angle.
|
|
haversine :: Float -> Float
|
|
haversine = (^ 2) . sin . (/ 2)
|
|
|
|
-- The approximate distance, in kilometers, between two points on Earth.
|
|
-- The latitude and longtitude are assumed to be in degrees.
|
|
earthDist :: (Float, Float) -> (Float, Float) -> Float
|
|
earthDist = distDeg 6371
|
|
where
|
|
distDeg radius p1 p2 = distRad radius (deg2rad p1) (deg2rad p2)
|
|
distRad radius (lat1, lng1) (lat2, lng2) =
|
|
(2 * radius) *
|
|
asin
|
|
(min
|
|
1.0
|
|
(sqrt $
|
|
haversine (lat2 - lat1) +
|
|
((cos lat1 * cos lat2) * haversine (lng2 - lng1))))
|
|
deg2rad = d2r *** d2r
|
|
where
|
|
d2r = (/ 180) . (pi *)
|
|
|
|
main :: IO ()
|
|
main =
|
|
printf
|
|
"The distance between BNA and LAX is about %0.f km.\n"
|
|
(earthDist bna lax)
|
|
where
|
|
bna = (36.12, -86.67)
|
|
lax = (33.94, -118.40)
|