10 #if !defined(GEOGRAPHICLIB_GEODESICEXACT_HPP)
11 #define GEOGRAPHICLIB_GEODESICEXACT_HPP 1
16 #if !defined(GEOGRAPHICLIB_GEODESICEXACT_ORDER)
20 # define GEOGRAPHICLIB_GEODESICEXACT_ORDER 30
25 class GeodesicLineExact;
85 static const int nC4x_ = (nC4_ * (nC4_ + 1)) / 2;
86 static const unsigned maxit1_ = 20;
88 real tiny_, tol0_, tol1_, tol2_, tolb_, xthresh_;
103 static real CosSeries(real sinx, real cosx,
const real c[],
int n);
104 static inline real AngRound(real x) {
111 const real z = 1/
real(16);
114 y = y < z ? z - (z - y) : y;
115 return x < 0 ? -y : y;
117 static inline void SinCosNorm(real& sinx, real& cosx) {
122 static real Astroid(real x, real y);
124 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
127 void Lengths(
const EllipticFunction& E,
129 real ssig1, real csig1, real dn1,
130 real ssig2, real csig2, real dn2,
131 real cbet1, real cbet2,
132 real& s12s, real& m12a, real& m0,
133 bool scalep, real& M12, real& M21)
const;
134 real InverseStart(EllipticFunction& E,
135 real sbet1, real cbet1, real dn1,
136 real sbet2, real cbet2, real dn2,
138 real& salp1, real& calp1,
139 real& salp2, real& calp2, real& dnm)
const;
140 real Lambda12(real sbet1, real cbet1, real dn1,
141 real sbet2, real cbet2, real dn2,
142 real salp1, real calp1,
143 real& salp2, real& calp2, real& sig12,
144 real& ssig1, real& csig1, real& ssig2, real& csig2,
146 real& omg12,
bool diffp, real& dlam12)
const;
151 void C4f(real k2, real c[])
const;
156 static Math::real inline reale(
long long hi,
long long lo) {
158 return ldexp(
real(hi), 52) + lo;
184 LATITUDE = 1U<<7 | CAP_NONE,
189 LONGITUDE = 1U<<8 | CAP_H,
196 AZIMUTH = 1U<<9 | CAP_NONE,
201 DISTANCE = 1U<<10 | CAP_E,
207 DISTANCE_IN = 1U<<11 | CAP_E,
212 REDUCEDLENGTH = 1U<<12 | CAP_D,
217 GEODESICSCALE = 1U<<13 | CAP_D,
222 AREA = 1U<<14 | CAP_C4,
227 LONG_NOWRAP = 1U<<15,
233 ALL = OUT_ALL| CAP_ALL,
292 real& lat2, real& lon2, real& azi2,
293 real& m12, real& M12, real& M21, real& S12)
296 return GenDirect(lat1, lon1, azi1,
false, s12,
297 LATITUDE | LONGITUDE | AZIMUTH |
298 REDUCEDLENGTH | GEODESICSCALE | AREA,
299 lat2, lon2, azi2, t, m12, M12, M21, S12);
306 real& lat2, real& lon2)
309 return GenDirect(lat1, lon1, azi1,
false, s12,
310 LATITUDE | LONGITUDE,
311 lat2, lon2, t, t, t, t, t, t);
318 real& lat2, real& lon2, real& azi2)
321 return GenDirect(lat1, lon1, azi1,
false, s12,
322 LATITUDE | LONGITUDE | AZIMUTH,
323 lat2, lon2, azi2, t, t, t, t, t);
330 real& lat2, real& lon2, real& azi2, real& m12)
333 return GenDirect(lat1, lon1, azi1,
false, s12,
334 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
335 lat2, lon2, azi2, t, m12, t, t, t);
342 real& lat2, real& lon2, real& azi2,
343 real& M12, real& M21)
346 return GenDirect(lat1, lon1, azi1,
false, s12,
347 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
348 lat2, lon2, azi2, t, t, M12, M21, t);
355 real& lat2, real& lon2, real& azi2,
356 real& m12, real& M12, real& M21)
359 return GenDirect(lat1, lon1, azi1,
false, s12,
360 LATITUDE | LONGITUDE | AZIMUTH |
361 REDUCEDLENGTH | GEODESICSCALE,
362 lat2, lon2, azi2, t, m12, M12, M21, t);
404 void ArcDirect(real lat1, real lon1, real azi1, real a12,
405 real& lat2, real& lon2, real& azi2, real& s12,
406 real& m12, real& M12, real& M21, real& S12)
408 GenDirect(lat1, lon1, azi1,
true, a12,
409 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
410 REDUCEDLENGTH | GEODESICSCALE | AREA,
411 lat2, lon2, azi2, s12, m12, M12, M21, S12);
417 void ArcDirect(real lat1, real lon1, real azi1, real a12,
418 real& lat2, real& lon2)
const {
420 GenDirect(lat1, lon1, azi1,
true, a12,
421 LATITUDE | LONGITUDE,
422 lat2, lon2, t, t, t, t, t, t);
428 void ArcDirect(real lat1, real lon1, real azi1, real a12,
429 real& lat2, real& lon2, real& azi2)
const {
431 GenDirect(lat1, lon1, azi1,
true, a12,
432 LATITUDE | LONGITUDE | AZIMUTH,
433 lat2, lon2, azi2, t, t, t, t, t);
439 void ArcDirect(real lat1, real lon1, real azi1, real a12,
440 real& lat2, real& lon2, real& azi2, real& s12)
443 GenDirect(lat1, lon1, azi1,
true, a12,
444 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
445 lat2, lon2, azi2, s12, t, t, t, t);
451 void ArcDirect(real lat1, real lon1, real azi1, real a12,
452 real& lat2, real& lon2, real& azi2,
453 real& s12, real& m12)
const {
455 GenDirect(lat1, lon1, azi1,
true, a12,
456 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
458 lat2, lon2, azi2, s12, m12, t, t, t);
464 void ArcDirect(real lat1, real lon1, real azi1, real a12,
465 real& lat2, real& lon2, real& azi2, real& s12,
466 real& M12, real& M21)
const {
468 GenDirect(lat1, lon1, azi1,
true, a12,
469 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
471 lat2, lon2, azi2, s12, t, M12, M21, t);
477 void ArcDirect(real lat1, real lon1, real azi1, real a12,
478 real& lat2, real& lon2, real& azi2, real& s12,
479 real& m12, real& M12, real& M21)
const {
481 GenDirect(lat1, lon1, azi1,
true, a12,
482 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
483 REDUCEDLENGTH | GEODESICSCALE,
484 lat2, lon2, azi2, s12, m12, M12, M21, t);
544 Math::real GenDirect(real lat1, real lon1, real azi1,
545 bool arcmode, real s12_a12,
unsigned outmask,
546 real& lat2, real& lon2, real& azi2,
547 real& s12, real& m12, real& M12, real& M21,
586 real& s12, real& azi1, real& azi2, real& m12,
587 real& M12, real& M21, real& S12)
const {
588 return GenInverse(lat1, lon1, lat2, lon2,
590 REDUCEDLENGTH | GEODESICSCALE | AREA,
591 s12, azi1, azi2, m12, M12, M21, S12);
600 return GenInverse(lat1, lon1, lat2, lon2,
602 s12, t, t, t, t, t, t);
609 real& azi1, real& azi2)
const {
611 return GenInverse(lat1, lon1, lat2, lon2,
613 t, azi1, azi2, t, t, t, t);
620 real& s12, real& azi1, real& azi2)
623 return GenInverse(lat1, lon1, lat2, lon2,
625 s12, azi1, azi2, t, t, t, t);
632 real& s12, real& azi1, real& azi2, real& m12)
635 return GenInverse(lat1, lon1, lat2, lon2,
636 DISTANCE | AZIMUTH | REDUCEDLENGTH,
637 s12, azi1, azi2, m12, t, t, t);
644 real& s12, real& azi1, real& azi2,
645 real& M12, real& M21)
const {
647 return GenInverse(lat1, lon1, lat2, lon2,
648 DISTANCE | AZIMUTH | GEODESICSCALE,
649 s12, azi1, azi2, t, M12, M21, t);
656 real& s12, real& azi1, real& azi2, real& m12,
657 real& M12, real& M21)
const {
659 return GenInverse(lat1, lon1, lat2, lon2,
661 REDUCEDLENGTH | GEODESICSCALE,
662 s12, azi1, azi2, m12, M12, M21, t);
702 Math::real GenInverse(real lat1, real lon1, real lat2, real lon2,
704 real& s12, real& azi1, real& azi2,
705 real& m12, real& M12, real& M21, real& S12)
777 Math::real InverseFlattening()
const {
return 1/_f; }
800 #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
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
#define GEOGRAPHICLIB_VOLATILE
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
Namespace for GeographicLib.
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 MajorRadius() 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