Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 #include "GeographicLib/AzimuthalEquidistant.hpp"
00011 
00012 #define GEOGRAPHICLIB_AZIMUTHALEQUIDISTANT_CPP "$Id: AzimuthalEquidistant.cpp 6921 2010-12-31 14:34:50Z karney $"
00013 
00014 RCSID_DECL(GEOGRAPHICLIB_AZIMUTHALEQUIDISTANT_CPP)
00015 RCSID_DECL(GEOGRAPHICLIB_AZIMUTHALEQUIDISTANT_HPP)
00016 
00017 namespace GeographicLib {
00018 
00019   using namespace std;
00020 
00021   const Math::real AzimuthalEquidistant::eps =
00022     real(0.01) * sqrt(numeric_limits<real>::min());
00023 
00024   void AzimuthalEquidistant::Forward(real lat0, real lon0, real lat, real lon,
00025                                      real& x, real& y, real& azi, real& rk)
00026     const throw() {
00027     real sig, s, azi0, m;
00028     sig = _earth.Inverse(lat0, lon0, lat, lon, s, azi0, azi, m);
00029     azi0 *= Math::degree<real>();
00030     x = s * sin(azi0);
00031     y = s * cos(azi0);
00032     rk = !(sig <= eps) ? m / s : 1;
00033   }
00034 
00035   void AzimuthalEquidistant::Reverse(real lat0, real lon0, real x, real y,
00036                                      real& lat, real& lon, real& azi, real& rk)
00037     const throw() {
00038     real
00039       azi0 = atan2(x, y) / Math::degree<real>(),
00040       s = Math::hypot(x, y);
00041     real sig, m;
00042     sig = _earth.Direct(lat0, lon0, azi0, s, lat, lon, azi, m);
00043     rk = !(sig <= eps) ? m / s : 1;
00044   }
00045 
00046 }