12 namespace GeographicLib {
17 real(0.01) * sqrt(numeric_limits<real>::epsilon());
18 const Math::real CassiniSoldner::tiny_ = sqrt(numeric_limits<real>::min());
21 _meridian = _earth.Line(lat0, lon0,
real(0),
26 phi = LatitudeOrigin() * Math::degree<real>(),
27 f = _earth.Flattening();
28 _sbet0 = (1 - f) * sin(phi);
29 _cbet0 = abs(LatitudeOrigin()) == 90 ? 0 : cos(phi);
30 SinCosNorm(_sbet0, _cbet0);
34 real& azi, real& rk)
const throw() {
38 real sig12, s12, azi1, azi2;
40 sig12 = _earth.Inverse(lat, -abs(dlon), lat, abs(dlon), s12, azi1, azi2);
41 if (sig12 < 100 * tiny_)
46 real da = (azi2 - azi1)/2;
47 if (abs(dlon) <= 90) {
66 t, t, t, t, t, t, rk, t);
69 alp0 = perp.EquatorialAzimuth() * Math::degree<real>(),
70 calp0 = cos(alp0), salp0 = sin(alp0),
71 sbet1 = lat >=0 ? calp0 : -calp0,
72 cbet1 = abs(dlon) <= 90 ? abs(salp0) : -abs(salp0),
73 sbet01 = sbet1 * _cbet0 - cbet1 * _sbet0,
74 cbet01 = cbet1 * _cbet0 + sbet1 * _sbet0,
75 sig01 = atan2(sbet01, cbet01) / Math::degree<real>();
76 _meridian.GenPosition(
true, sig01,
78 t, t, t, y, t, t, t, t);
82 real& azi, real& rk)
const throw() {
87 _meridian.Position(y, lat1, lon1, azi0);
88 _earth.Direct(lat1, lon1, azi0 + 90, x, lat, lon, azi, rk, t);
static T AngNormalize(T x)
Header for GeographicLib::CassiniSoldner class.
GeographicLib::Math::real real
void Forward(real lat, real lon, real &x, real &y, real &azi, real &rk) const
void Reverse(real x, real y, real &lat, real &lon, real &azi, real &rk) const
Math::real GenPosition(bool arcmode, real s12_a12, unsigned outmask, real &lat2, real &lon2, real &azi2, real &s12, real &m12, real &M12, real &M21, real &S12) const
static T AngDiff(T x, T y)
void Reset(real lat0, real lon0)