10 #if !defined(GEOGRAPHICLIB_GEODESICEXACT_HPP)
11 #define GEOGRAPHICLIB_GEODESICEXACT_HPP 1
16 #if !defined(GEOGRAPHICLIB_GEODESICEXACT_ORDER)
20 # define GEOGRAPHICLIB_GEODESICEXACT_ORDER 30
23 namespace GeographicLib {
25 class GeodesicLineExact;
85 static const int nC4x_ = (nC4_ * (nC4_ + 1)) / 2;
86 static const unsigned maxit1_ = 20;
87 static const unsigned maxit2_ = maxit1_ +
88 std::numeric_limits<real>::digits + 10;
90 static const real tiny_;
91 static const real tol0_;
92 static const real tol1_;
93 static const real tol2_;
94 static const real tolb_;
95 static const real xthresh_;
110 static inline real AngRound(
real x)
throw() {
117 volatile real y = std::abs(x);
119 y = y < z ? z - (z - y) : y;
120 return x < 0 ? -y : y;
122 static inline void SinCosNorm(
real& sinx,
real& cosx)
throw() {
129 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
132 void Lengths(
const EllipticFunction& E,
138 bool scalep,
real& M12,
real& M21)
const throw();
139 real InverseStart(EllipticFunction& E,
151 real& omg12,
bool diffp,
real& dlam12)
156 void C4coeff() throw();
157 void C4f(
real k2,
real c[]) const throw();
181 LATITUDE = 1U<<7 | CAP_NONE,
186 LONGITUDE = 1U<<8 | CAP_H,
193 AZIMUTH = 1U<<9 | CAP_NONE,
198 DISTANCE = 1U<<10 | CAP_E,
204 DISTANCE_IN = 1U<<11 | CAP_E,
209 REDUCEDLENGTH = 1U<<12 | CAP_D,
214 GEODESICSCALE = 1U<<13 | CAP_D,
219 AREA = 1U<<14 | CAP_C4,
224 ALL = OUT_ALL| CAP_ALL,
283 real& lat2, real& lon2, real& azi2,
284 real& m12, real& M12, real& M21, real& S12)
287 return GenDirect(lat1, lon1, azi1,
false, s12,
288 LATITUDE | LONGITUDE | AZIMUTH |
289 REDUCEDLENGTH | GEODESICSCALE | AREA,
290 lat2, lon2, azi2, t, m12, M12, M21, S12);
297 real& lat2, real& lon2)
300 return GenDirect(lat1, lon1, azi1,
false, s12,
301 LATITUDE | LONGITUDE,
302 lat2, lon2, t, t, t, t, t, t);
309 real& lat2, real& lon2, real& azi2)
312 return GenDirect(lat1, lon1, azi1,
false, s12,
313 LATITUDE | LONGITUDE | AZIMUTH,
314 lat2, lon2, azi2, t, t, t, t, t);
321 real& lat2, real& lon2, real& azi2, real& m12)
324 return GenDirect(lat1, lon1, azi1,
false, s12,
325 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
326 lat2, lon2, azi2, t, m12, t, t, t);
333 real& lat2, real& lon2, real& azi2,
334 real& M12, real& M21)
337 return GenDirect(lat1, lon1, azi1,
false, s12,
338 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
339 lat2, lon2, azi2, t, t, M12, M21, t);
346 real& lat2, real& lon2, real& azi2,
347 real& m12, real& M12, real& M21)
350 return GenDirect(lat1, lon1, azi1,
false, s12,
351 LATITUDE | LONGITUDE | AZIMUTH |
352 REDUCEDLENGTH | GEODESICSCALE,
353 lat2, lon2, azi2, t, m12, M12, M21, t);
395 void ArcDirect(real lat1, real lon1, real azi1, real a12,
396 real& lat2, real& lon2, real& azi2, real& s12,
397 real& m12, real& M12, real& M21, real& S12)
399 GenDirect(lat1, lon1, azi1,
true, a12,
400 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
401 REDUCEDLENGTH | GEODESICSCALE | AREA,
402 lat2, lon2, azi2, s12, m12, M12, M21, S12);
408 void ArcDirect(real lat1, real lon1, real azi1, real a12,
409 real& lat2, real& lon2)
const throw() {
411 GenDirect(lat1, lon1, azi1,
true, a12,
412 LATITUDE | LONGITUDE,
413 lat2, lon2, t, t, t, t, t, t);
419 void ArcDirect(real lat1, real lon1, real azi1, real a12,
420 real& lat2, real& lon2, real& azi2)
const throw() {
422 GenDirect(lat1, lon1, azi1,
true, a12,
423 LATITUDE | LONGITUDE | AZIMUTH,
424 lat2, lon2, azi2, t, t, t, t, t);
430 void ArcDirect(real lat1, real lon1, real azi1, real a12,
431 real& lat2, real& lon2, real& azi2, real& s12)
434 GenDirect(lat1, lon1, azi1,
true, a12,
435 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
436 lat2, lon2, azi2, s12, t, t, t, t);
442 void ArcDirect(real lat1, real lon1, real azi1, real a12,
443 real& lat2, real& lon2, real& azi2,
444 real& s12, real& m12)
const throw() {
446 GenDirect(lat1, lon1, azi1,
true, a12,
447 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
449 lat2, lon2, azi2, s12, m12, t, t, t);
455 void ArcDirect(real lat1, real lon1, real azi1, real a12,
456 real& lat2, real& lon2, real& azi2, real& s12,
457 real& M12, real& M21)
const throw() {
459 GenDirect(lat1, lon1, azi1,
true, a12,
460 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
462 lat2, lon2, azi2, s12, t, M12, M21, t);
468 void ArcDirect(real lat1, real lon1, real azi1, real a12,
469 real& lat2, real& lon2, real& azi2, real& s12,
470 real& m12, real& M12, real& M21)
const throw() {
472 GenDirect(lat1, lon1, azi1,
true, a12,
473 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
474 REDUCEDLENGTH | GEODESICSCALE,
475 lat2, lon2, azi2, s12, m12, M12, M21, t);
528 bool arcmode,
real s12_a12,
unsigned outmask,
531 real& S12)
const throw();
569 real& s12, real& azi1, real& azi2, real& m12,
570 real& M12, real& M21, real& S12)
const throw() {
571 return GenInverse(lat1, lon1, lat2, lon2,
573 REDUCEDLENGTH | GEODESICSCALE | AREA,
574 s12, azi1, azi2, m12, M12, M21, S12);
581 real& s12)
const throw() {
583 return GenInverse(lat1, lon1, lat2, lon2,
585 s12, t, t, t, t, t, t);
592 real& azi1, real& azi2)
const throw() {
594 return GenInverse(lat1, lon1, lat2, lon2,
596 t, azi1, azi2, t, t, t, t);
603 real& s12, real& azi1, real& azi2)
606 return GenInverse(lat1, lon1, lat2, lon2,
608 s12, azi1, azi2, t, t, t, t);
615 real& s12, real& azi1, real& azi2, real& m12)
618 return GenInverse(lat1, lon1, lat2, lon2,
619 DISTANCE | AZIMUTH | REDUCEDLENGTH,
620 s12, azi1, azi2, m12, t, t, t);
627 real& s12, real& azi1, real& azi2,
628 real& M12, real& M21)
const throw() {
630 return GenInverse(lat1, lon1, lat2, lon2,
631 DISTANCE | AZIMUTH | GEODESICSCALE,
632 s12, azi1, azi2, t, M12, M21, t);
639 real& s12, real& azi1, real& azi2, real& m12,
640 real& M12, real& M21)
const throw() {
642 return GenInverse(lat1, lon1, lat2, lon2,
644 REDUCEDLENGTH | GEODESICSCALE,
645 s12, azi1, azi2, m12, M12, M21, t);
747 Math::real MajorRadius() const throw() {
return _a; }
760 Math::real InverseFlattening()
const throw() {
return 1/_f; }
770 {
return 4 * Math::pi<real>() * _c2; }
783 #endif // GEOGRAPHICLIB_GEODESICEXACT_HPP
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2, real &s12, real &m12, real &M12, real &M21, real &S12) const
#define GEOGRAPHICLIB_EXPORT
Math::real Flattening() const
Math::real EllipsoidArea() const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2, real &m12, real &M12, real &M21) const
GeographicLib::Math::real real
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2, real &azi2) const
Mathematical functions needed by GeographicLib.
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2, real &azi2, real &m12, real &M12, real &M21) const
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2) const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2, real &M12, real &M21) const
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2, real &azi2, real &m12, real &M12, real &M21, real &S12) const
static const GeodesicExact WGS84
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2, real &s12) const
#define GEOGRAPHICLIB_GEODESICEXACT_ORDER
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2) const
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2, real &s12, real &M12, real &M21) const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &azi1, real &azi2) const
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2, real &s12, real &m12) const
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2, real &azi2, real &M12, real &M21) const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12) const
Header for GeographicLib::EllipticFunction class.
Exact geodesic calculations.
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2) const
Header for GeographicLib::Constants class.
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2, real &azi2, real &m12) const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2, real &m12) const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2) const
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2, real &s12, real &m12, real &M12, real &M21) const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2, real &m12, real &M12, real &M21, real &S12) const