00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <GeographicLib/AzimuthalEquidistant.hpp>
00011
00012 namespace GeographicLib {
00013
00014 using namespace std;
00015
00016 AzimuthalEquidistant::AzimuthalEquidistant(const Geodesic& earth)
00017 : eps_(real(0.01) * sqrt(numeric_limits<real>::min()))
00018 , _earth(earth) {}
00019
00020 void AzimuthalEquidistant::Forward(real lat0, real lon0, real lat, real lon,
00021 real& x, real& y, real& azi, real& rk)
00022 const {
00023 real sig, s, azi0, m;
00024 sig = _earth.Inverse(lat0, lon0, lat, lon, s, azi0, azi, m);
00025 azi0 *= Math::degree();
00026 x = s * sin(azi0);
00027 y = s * cos(azi0);
00028 rk = !(sig <= eps_) ? m / s : 1;
00029 }
00030
00031 void AzimuthalEquidistant::Reverse(real lat0, real lon0, real x, real y,
00032 real& lat, real& lon, real& azi, real& rk)
00033 const {
00034 real
00035 azi0 = atan2(x, y) / Math::degree(),
00036 s = Math::hypot(x, y);
00037 real sig, m;
00038 sig = _earth.Direct(lat0, lon0, azi0, s, lat, lon, azi, m);
00039 rk = !(sig <= eps_) ? m / s : 1;
00040 }
00041
00042 }