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 {
174 static const int nA3x_ = nA3_;
176 static const int nC3x_ = (nC3_ * (nC3_ - 1)) / 2;
178 static const int nC4x_ = (nC4_ * (nC4_ + 1)) / 2;
179 static const unsigned maxit1_ = 20;
180 static const unsigned maxit2_ = maxit1_ +
181 std::numeric_limits<real>::digits + 10;
183 static const real tiny_;
184 static const real tol0_;
185 static const real tol1_;
186 static const real tol2_;
187 static const real tolb_;
188 static const real xthresh_;
201 static real SinCosSeries(
bool sinp,
204 static inline real AngRound(
real x)
throw() {
211 volatile real y = std::abs(x);
213 y = y < z ? z - (z - y) : y;
214 return x < 0 ? -y : y;
216 static inline void SinCosNorm(
real& sinx,
real& cosx)
throw() {
223 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
224 real _A3x[nA3x_], _C3x[nC3x_], _C4x[nC4x_];
232 real C1a[],
real C2a[])
const throw();
238 real C1a[],
real C2a[])
const throw();
250 static real A1m1f(
real eps)
throw();
251 static void C1f(
real eps,
real c[])
throw();
252 static void C1pf(
real eps,
real c[])
throw();
253 static real A2m1f(
real eps)
throw();
254 static void C2f(
real eps,
real c[])
throw();
256 void A3coeff() throw();
258 void C3coeff() throw();
259 void C3f(
real eps,
real c[]) const throw();
260 void C4coeff() throw();
261 void C4f(
real k2,
real c[]) const throw();
284 LATITUDE = 1U<<7 | CAP_NONE,
289 LONGITUDE = 1U<<8 | CAP_C3,
296 AZIMUTH = 1U<<9 | CAP_NONE,
301 DISTANCE = 1U<<10 | CAP_C1,
307 DISTANCE_IN = 1U<<11 | CAP_C1 | CAP_C1p,
312 REDUCEDLENGTH = 1U<<12 | CAP_C1 | CAP_C2,
317 GEODESICSCALE = 1U<<13 | CAP_C1 | CAP_C2,
322 AREA = 1U<<14 | CAP_C4,
327 ALL = OUT_ALL| CAP_ALL,
386 real& lat2, real& lon2, real& azi2,
387 real& m12, real& M12, real& M21, real& S12)
390 return GenDirect(lat1, lon1, azi1,
false, s12,
391 LATITUDE | LONGITUDE | AZIMUTH |
392 REDUCEDLENGTH | GEODESICSCALE | AREA,
393 lat2, lon2, azi2, t, m12, M12, M21, S12);
400 real& lat2, real& lon2)
403 return GenDirect(lat1, lon1, azi1,
false, s12,
404 LATITUDE | LONGITUDE,
405 lat2, lon2, t, t, t, t, t, t);
412 real& lat2, real& lon2, real& azi2)
415 return GenDirect(lat1, lon1, azi1,
false, s12,
416 LATITUDE | LONGITUDE | AZIMUTH,
417 lat2, lon2, azi2, t, t, t, t, t);
424 real& lat2, real& lon2, real& azi2, real& m12)
427 return GenDirect(lat1, lon1, azi1,
false, s12,
428 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
429 lat2, lon2, azi2, t, m12, t, t, t);
436 real& lat2, real& lon2, real& azi2,
437 real& M12, real& M21)
440 return GenDirect(lat1, lon1, azi1,
false, s12,
441 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
442 lat2, lon2, azi2, t, t, M12, M21, t);
449 real& lat2, real& lon2, real& azi2,
450 real& m12, real& M12, real& M21)
453 return GenDirect(lat1, lon1, azi1,
false, s12,
454 LATITUDE | LONGITUDE | AZIMUTH |
455 REDUCEDLENGTH | GEODESICSCALE,
456 lat2, lon2, azi2, t, m12, M12, M21, t);
498 void ArcDirect(real lat1, real lon1, real azi1, real a12,
499 real& lat2, real& lon2, real& azi2, real& s12,
500 real& m12, real& M12, real& M21, real& S12)
502 GenDirect(lat1, lon1, azi1,
true, a12,
503 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
504 REDUCEDLENGTH | GEODESICSCALE | AREA,
505 lat2, lon2, azi2, s12, m12, M12, M21, S12);
511 void ArcDirect(real lat1, real lon1, real azi1, real a12,
512 real& lat2, real& lon2)
const throw() {
514 GenDirect(lat1, lon1, azi1,
true, a12,
515 LATITUDE | LONGITUDE,
516 lat2, lon2, t, t, t, t, t, t);
522 void ArcDirect(real lat1, real lon1, real azi1, real a12,
523 real& lat2, real& lon2, real& azi2)
const throw() {
525 GenDirect(lat1, lon1, azi1,
true, a12,
526 LATITUDE | LONGITUDE | AZIMUTH,
527 lat2, lon2, azi2, t, t, t, t, t);
533 void ArcDirect(real lat1, real lon1, real azi1, real a12,
534 real& lat2, real& lon2, real& azi2, real& s12)
537 GenDirect(lat1, lon1, azi1,
true, a12,
538 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
539 lat2, lon2, azi2, s12, t, t, t, t);
545 void ArcDirect(real lat1, real lon1, real azi1, real a12,
546 real& lat2, real& lon2, real& azi2,
547 real& s12, real& m12)
const throw() {
549 GenDirect(lat1, lon1, azi1,
true, a12,
550 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
552 lat2, lon2, azi2, s12, m12, t, t, t);
558 void ArcDirect(real lat1, real lon1, real azi1, real a12,
559 real& lat2, real& lon2, real& azi2, real& s12,
560 real& M12, real& M21)
const throw() {
562 GenDirect(lat1, lon1, azi1,
true, a12,
563 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
565 lat2, lon2, azi2, s12, t, M12, M21, t);
571 void ArcDirect(real lat1, real lon1, real azi1, real a12,
572 real& lat2, real& lon2, real& azi2, real& s12,
573 real& m12, real& M12, real& M21)
const throw() {
575 GenDirect(lat1, lon1, azi1,
true, a12,
576 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
577 REDUCEDLENGTH | GEODESICSCALE,
578 lat2, lon2, azi2, s12, m12, M12, M21, t);
630 bool arcmode,
real s12_a12,
unsigned outmask,
633 real& S12)
const throw();
675 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
676 real& s12, real& azi1, real& azi2, real& m12,
677 real& M12, real& M21, real& S12)
const throw() {
678 return GenInverse(lat1, lon1, lat2, lon2,
680 REDUCEDLENGTH | GEODESICSCALE | AREA,
681 s12, azi1, azi2, m12, M12, M21, S12);
687 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
688 real& s12)
const throw() {
690 return GenInverse(lat1, lon1, lat2, lon2,
692 s12, t, t, t, t, t, t);
698 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
699 real& azi1, real& azi2)
const throw() {
701 return GenInverse(lat1, lon1, lat2, lon2,
703 t, azi1, azi2, t, t, t, t);
709 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
710 real& s12, real& azi1, real& azi2)
713 return GenInverse(lat1, lon1, lat2, lon2,
715 s12, azi1, azi2, t, t, t, t);
721 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
722 real& s12, real& azi1, real& azi2, real& m12)
725 return GenInverse(lat1, lon1, lat2, lon2,
726 DISTANCE | AZIMUTH | REDUCEDLENGTH,
727 s12, azi1, azi2, m12, t, t, t);
733 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
734 real& s12, real& azi1, real& azi2,
735 real& M12, real& M21)
const throw() {
737 return GenInverse(lat1, lon1, lat2, lon2,
738 DISTANCE | AZIMUTH | GEODESICSCALE,
739 s12, azi1, azi2, t, M12, M21, t);
745 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
746 real& s12, real& azi1, real& azi2, real& m12,
747 real& M12, real& M21)
const throw() {
749 return GenInverse(lat1, lon1, lat2, lon2,
751 REDUCEDLENGTH | GEODESICSCALE,
752 s12, azi1, azi2, m12, M12, M21, t);
851 Math::real MajorRadius() const throw() {
return _a; }
864 Math::real InverseFlattening()
const throw() {
return 1/_f; }
874 {
return 4 * Math::pi<real>() * _c2; }
887 #endif // GEOGRAPHICLIB_GEODESIC_HPP