10 #if !defined(GEOGRAPHICLIB_GEODESIC_HPP)
11 #define GEOGRAPHICLIB_GEODESIC_HPP 1
15 #if !defined(GEOGRAPHICLIB_GEODESIC_ORDER)
19 # define GEOGRAPHICLIB_GEODESIC_ORDER \
20 (GEOGRAPHICLIB_PRECISION == 2 ? 6 : (GEOGRAPHICLIB_PRECISION == 1 ? 3 : 7))
23 namespace GeographicLib {
179 static const int nA3x_ = nA3_;
181 static const int nC3x_ = (nC3_ * (nC3_ - 1)) / 2;
183 static const int nC4x_ = (nC4_ * (nC4_ + 1)) / 2;
184 static const unsigned maxit1_ = 20;
185 static const unsigned maxit2_ = maxit1_ +
186 std::numeric_limits<real>::digits + 10;
188 static const real tiny_;
189 static const real tol0_;
190 static const real tol1_;
191 static const real tol2_;
192 static const real tolb_;
193 static const real xthresh_;
206 static real SinCosSeries(
bool sinp,
209 static inline real AngRound(
real x)
throw() {
216 volatile real y = std::abs(x);
218 y = y < z ? z - (z - y) : y;
219 return x < 0 ? -y : y;
221 static inline void SinCosNorm(
real& sinx,
real& cosx)
throw() {
228 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
229 real _A3x[nA3x_], _C3x[nC3x_], _C4x[nC4x_];
237 real C1a[],
real C2a[])
const throw();
243 real C1a[],
real C2a[])
const throw();
255 static real A1m1f(
real eps)
throw();
256 static void C1f(
real eps,
real c[])
throw();
257 static void C1pf(
real eps,
real c[])
throw();
258 static real A2m1f(
real eps)
throw();
259 static void C2f(
real eps,
real c[])
throw();
261 void A3coeff() throw();
263 void C3coeff() throw();
264 void C3f(
real eps,
real c[]) const throw();
265 void C4coeff() throw();
266 void C4f(
real k2,
real c[]) const throw();
289 LATITUDE = 1U<<7 | CAP_NONE,
294 LONGITUDE = 1U<<8 | CAP_C3,
301 AZIMUTH = 1U<<9 | CAP_NONE,
306 DISTANCE = 1U<<10 | CAP_C1,
312 DISTANCE_IN = 1U<<11 | CAP_C1 | CAP_C1p,
317 REDUCEDLENGTH = 1U<<12 | CAP_C1 | CAP_C2,
322 GEODESICSCALE = 1U<<13 | CAP_C1 | CAP_C2,
327 AREA = 1U<<14 | CAP_C4,
332 ALL = OUT_ALL| CAP_ALL,
391 real& lat2, real& lon2, real& azi2,
392 real& m12, real& M12, real& M21, real& S12)
395 return GenDirect(lat1, lon1, azi1,
false, s12,
396 LATITUDE | LONGITUDE | AZIMUTH |
397 REDUCEDLENGTH | GEODESICSCALE | AREA,
398 lat2, lon2, azi2, t, m12, M12, M21, S12);
405 real& lat2, real& lon2)
408 return GenDirect(lat1, lon1, azi1,
false, s12,
409 LATITUDE | LONGITUDE,
410 lat2, lon2, t, t, t, t, t, t);
417 real& lat2, real& lon2, real& azi2)
420 return GenDirect(lat1, lon1, azi1,
false, s12,
421 LATITUDE | LONGITUDE | AZIMUTH,
422 lat2, lon2, azi2, t, t, t, t, t);
429 real& lat2, real& lon2, real& azi2, real& m12)
432 return GenDirect(lat1, lon1, azi1,
false, s12,
433 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
434 lat2, lon2, azi2, t, m12, t, t, t);
441 real& lat2, real& lon2, real& azi2,
442 real& M12, real& M21)
445 return GenDirect(lat1, lon1, azi1,
false, s12,
446 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
447 lat2, lon2, azi2, t, t, M12, M21, t);
454 real& lat2, real& lon2, real& azi2,
455 real& m12, real& M12, real& M21)
458 return GenDirect(lat1, lon1, azi1,
false, s12,
459 LATITUDE | LONGITUDE | AZIMUTH |
460 REDUCEDLENGTH | GEODESICSCALE,
461 lat2, lon2, azi2, t, m12, M12, M21, t);
503 void ArcDirect(real lat1, real lon1, real azi1, real a12,
504 real& lat2, real& lon2, real& azi2, real& s12,
505 real& m12, real& M12, real& M21, real& S12)
507 GenDirect(lat1, lon1, azi1,
true, a12,
508 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
509 REDUCEDLENGTH | GEODESICSCALE | AREA,
510 lat2, lon2, azi2, s12, m12, M12, M21, S12);
516 void ArcDirect(real lat1, real lon1, real azi1, real a12,
517 real& lat2, real& lon2)
const throw() {
519 GenDirect(lat1, lon1, azi1,
true, a12,
520 LATITUDE | LONGITUDE,
521 lat2, lon2, t, t, t, t, t, t);
527 void ArcDirect(real lat1, real lon1, real azi1, real a12,
528 real& lat2, real& lon2, real& azi2)
const throw() {
530 GenDirect(lat1, lon1, azi1,
true, a12,
531 LATITUDE | LONGITUDE | AZIMUTH,
532 lat2, lon2, azi2, t, t, t, t, t);
538 void ArcDirect(real lat1, real lon1, real azi1, real a12,
539 real& lat2, real& lon2, real& azi2, real& s12)
542 GenDirect(lat1, lon1, azi1,
true, a12,
543 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
544 lat2, lon2, azi2, s12, t, t, t, t);
550 void ArcDirect(real lat1, real lon1, real azi1, real a12,
551 real& lat2, real& lon2, real& azi2,
552 real& s12, real& m12)
const throw() {
554 GenDirect(lat1, lon1, azi1,
true, a12,
555 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
557 lat2, lon2, azi2, s12, m12, t, t, t);
563 void ArcDirect(real lat1, real lon1, real azi1, real a12,
564 real& lat2, real& lon2, real& azi2, real& s12,
565 real& M12, real& M21)
const throw() {
567 GenDirect(lat1, lon1, azi1,
true, a12,
568 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
570 lat2, lon2, azi2, s12, t, M12, M21, t);
576 void ArcDirect(real lat1, real lon1, real azi1, real a12,
577 real& lat2, real& lon2, real& azi2, real& s12,
578 real& m12, real& M12, real& M21)
const throw() {
580 GenDirect(lat1, lon1, azi1,
true, a12,
581 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
582 REDUCEDLENGTH | GEODESICSCALE,
583 lat2, lon2, azi2, s12, m12, M12, M21, t);
636 bool arcmode,
real s12_a12,
unsigned outmask,
639 real& S12)
const throw();
682 real& s12, real& azi1, real& azi2, real& m12,
683 real& M12, real& M21, real& S12)
const throw() {
684 return GenInverse(lat1, lon1, lat2, lon2,
686 REDUCEDLENGTH | GEODESICSCALE | AREA,
687 s12, azi1, azi2, m12, M12, M21, S12);
694 real& s12)
const throw() {
696 return GenInverse(lat1, lon1, lat2, lon2,
698 s12, t, t, t, t, t, t);
705 real& azi1, real& azi2)
const throw() {
707 return GenInverse(lat1, lon1, lat2, lon2,
709 t, azi1, azi2, t, t, t, t);
716 real& s12, real& azi1, real& azi2)
719 return GenInverse(lat1, lon1, lat2, lon2,
721 s12, azi1, azi2, t, t, t, t);
728 real& s12, real& azi1, real& azi2, real& m12)
731 return GenInverse(lat1, lon1, lat2, lon2,
732 DISTANCE | AZIMUTH | REDUCEDLENGTH,
733 s12, azi1, azi2, m12, t, t, t);
740 real& s12, real& azi1, real& azi2,
741 real& M12, real& M21)
const throw() {
743 return GenInverse(lat1, lon1, lat2, lon2,
744 DISTANCE | AZIMUTH | GEODESICSCALE,
745 s12, azi1, azi2, t, M12, M21, t);
752 real& s12, real& azi1, real& azi2, real& m12,
753 real& M12, real& M21)
const throw() {
755 return GenInverse(lat1, lon1, lat2, lon2,
757 REDUCEDLENGTH | GEODESICSCALE,
758 s12, azi1, azi2, m12, M12, M21, t);
859 Math::real MajorRadius() const throw() {
return _a; }
872 Math::real InverseFlattening()
const throw() {
return 1/_f; }
882 {
return 4 * Math::pi<real>() * _c2; }
895 #endif // GEOGRAPHICLIB_GEODESIC_HPP
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2, real &s12, real &M12, real &M21) const
#define GEOGRAPHICLIB_EXPORT
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 &M12, real &M21, real &S12) const
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2, real &azi2, real &m12) const
GeographicLib::Math::real real
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
Mathematical functions needed by GeographicLib.
void ArcDirect(real lat1, real lon1, real azi1, real a12, 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 &M12, real &M21) const
Math::real Direct(real lat1, real lon1, real azi1, real s12, 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 Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2, real &m12) const
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2, real &azi2, real &m12, real &M12, real &M21) const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2) const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12) const
Math::real EllipsoidArea() const
static const Geodesic WGS84
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, 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, real &S12) 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
Header for GeographicLib::Constants class.
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) const
#define GEOGRAPHICLIB_GEODESIC_ORDER
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2, real &azi2) 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 Flattening() const