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 real Astroid(real x, real y);
106 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
111 real ssig1, real csig1, real dn1,
112 real ssig2, real csig2, real dn2,
113 real cbet1, real cbet2,
114 real& s12s, real& m12a, real& m0,
115 bool scalep, real& M12, real& M21)
const;
117 real sbet1, real cbet1, real dn1,
118 real sbet2, real cbet2, real dn2,
120 real& salp1, real& calp1,
121 real& salp2, real& calp2, real& dnm)
const;
122 real Lambda12(real sbet1, real cbet1, real dn1,
123 real sbet2, real cbet2, real dn2,
124 real salp1, real calp1,
125 real& salp2, real& calp2, real& sig12,
126 real& ssig1, real& csig1, real& ssig2, real& csig2,
128 real& omg12,
bool diffp, real& dlam12)
const;
133 void C4f(real k2, real c[])
const;
138 static Math::real inline reale(
long long hi,
long long lo) {
140 return ldexp(
real(hi), 52) + lo;
166 LATITUDE = 1U<<7 | CAP_NONE,
171 LONGITUDE = 1U<<8 | CAP_H,
178 AZIMUTH = 1U<<9 | CAP_NONE,
183 DISTANCE = 1U<<10 | CAP_E,
189 DISTANCE_IN = 1U<<11 | CAP_E,
194 REDUCEDLENGTH = 1U<<12 | CAP_D,
199 GEODESICSCALE = 1U<<13 | CAP_D,
204 AREA = 1U<<14 | CAP_C4,
209 LONG_NOWRAP = 1U<<15,
215 ALL = OUT_ALL| CAP_ALL,
274 real& lat2, real& lon2, real& azi2,
275 real& m12, real& M12, real& M21, real& S12)
278 return GenDirect(lat1, lon1, azi1,
false, s12,
279 LATITUDE | LONGITUDE | AZIMUTH |
280 REDUCEDLENGTH | GEODESICSCALE | AREA,
281 lat2, lon2, azi2, t, m12, M12, M21, S12);
288 real& lat2, real& lon2)
291 return GenDirect(lat1, lon1, azi1,
false, s12,
292 LATITUDE | LONGITUDE,
293 lat2, lon2, t, t, t, t, t, t);
300 real& lat2, real& lon2, real& azi2)
303 return GenDirect(lat1, lon1, azi1,
false, s12,
304 LATITUDE | LONGITUDE | AZIMUTH,
305 lat2, lon2, azi2, t, t, t, t, t);
312 real& lat2, real& lon2, real& azi2, real& m12)
315 return GenDirect(lat1, lon1, azi1,
false, s12,
316 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
317 lat2, lon2, azi2, t, m12, t, t, t);
324 real& lat2, real& lon2, real& azi2,
325 real& M12, real& M21)
328 return GenDirect(lat1, lon1, azi1,
false, s12,
329 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
330 lat2, lon2, azi2, t, t, M12, M21, t);
337 real& lat2, real& lon2, real& azi2,
338 real& m12, real& M12, real& M21)
341 return GenDirect(lat1, lon1, azi1,
false, s12,
342 LATITUDE | LONGITUDE | AZIMUTH |
343 REDUCEDLENGTH | GEODESICSCALE,
344 lat2, lon2, azi2, t, m12, M12, M21, t);
386 void ArcDirect(real lat1, real lon1, real azi1, real a12,
387 real& lat2, real& lon2, real& azi2, real& s12,
388 real& m12, real& M12, real& M21, real& S12)
390 GenDirect(lat1, lon1, azi1,
true, a12,
391 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
392 REDUCEDLENGTH | GEODESICSCALE | AREA,
393 lat2, lon2, azi2, s12, m12, M12, M21, S12);
399 void ArcDirect(real lat1, real lon1, real azi1, real a12,
400 real& lat2, real& lon2)
const {
402 GenDirect(lat1, lon1, azi1,
true, a12,
403 LATITUDE | LONGITUDE,
404 lat2, lon2, t, t, t, t, t, t);
410 void ArcDirect(real lat1, real lon1, real azi1, real a12,
411 real& lat2, real& lon2, real& azi2)
const {
413 GenDirect(lat1, lon1, azi1,
true, a12,
414 LATITUDE | LONGITUDE | AZIMUTH,
415 lat2, lon2, azi2, t, t, t, t, t);
421 void ArcDirect(real lat1, real lon1, real azi1, real a12,
422 real& lat2, real& lon2, real& azi2, real& s12)
425 GenDirect(lat1, lon1, azi1,
true, a12,
426 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
427 lat2, lon2, azi2, s12, t, t, t, t);
433 void ArcDirect(real lat1, real lon1, real azi1, real a12,
434 real& lat2, real& lon2, real& azi2,
435 real& s12, real& m12)
const {
437 GenDirect(lat1, lon1, azi1,
true, a12,
438 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
440 lat2, lon2, azi2, s12, m12, t, t, t);
446 void ArcDirect(real lat1, real lon1, real azi1, real a12,
447 real& lat2, real& lon2, real& azi2, real& s12,
448 real& M12, real& M21)
const {
450 GenDirect(lat1, lon1, azi1,
true, a12,
451 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
453 lat2, lon2, azi2, s12, t, M12, M21, t);
459 void ArcDirect(real lat1, real lon1, real azi1, real a12,
460 real& lat2, real& lon2, real& azi2, real& s12,
461 real& m12, real& M12, real& M21)
const {
463 GenDirect(lat1, lon1, azi1,
true, a12,
464 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
465 REDUCEDLENGTH | GEODESICSCALE,
466 lat2, lon2, azi2, s12, m12, M12, M21, t);
526 Math::real GenDirect(real lat1, real lon1, real azi1,
527 bool arcmode, real s12_a12,
unsigned outmask,
528 real& lat2, real& lon2, real& azi2,
529 real& s12, real& m12, real& M12, real& M21,
568 real& s12, real& azi1, real& azi2, real& m12,
569 real& M12, real& M21, real& S12)
const {
570 return GenInverse(lat1, lon1, lat2, lon2,
572 REDUCEDLENGTH | GEODESICSCALE | AREA,
573 s12, azi1, azi2, m12, M12, M21, S12);
582 return GenInverse(lat1, lon1, lat2, lon2,
584 s12, t, t, t, t, t, t);
591 real& azi1, real& azi2)
const {
593 return GenInverse(lat1, lon1, lat2, lon2,
595 t, azi1, azi2, t, t, t, t);
602 real& s12, real& azi1, real& azi2)
605 return GenInverse(lat1, lon1, lat2, lon2,
607 s12, azi1, azi2, t, t, t, t);
614 real& s12, real& azi1, real& azi2, real& m12)
617 return GenInverse(lat1, lon1, lat2, lon2,
618 DISTANCE | AZIMUTH | REDUCEDLENGTH,
619 s12, azi1, azi2, m12, t, t, t);
626 real& s12, real& azi1, real& azi2,
627 real& M12, real& M21)
const {
629 return GenInverse(lat1, lon1, lat2, lon2,
630 DISTANCE | AZIMUTH | GEODESICSCALE,
631 s12, azi1, azi2, t, M12, M21, t);
638 real& s12, real& azi1, real& azi2, real& m12,
639 real& M12, real& M21)
const {
641 return GenInverse(lat1, lon1, lat2, lon2,
643 REDUCEDLENGTH | GEODESICSCALE,
644 s12, azi1, azi2, m12, M12, M21, t);
684 Math::real GenInverse(real lat1, real lon1, real lat2, real lon2,
686 real& s12, real& azi1, real& azi2,
687 real& m12, real& M12, real& M21, real& S12)
759 Math::real InverseFlattening()
const {
return 1/_f; }
782 #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
Elliptic integrals and functions.
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
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