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,
unsigned outmask,
114 real& s12s, real& m12a, real& m0,
115 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;
165 LATITUDE = 1U<<7 | CAP_NONE,
170 LONGITUDE = 1U<<8 | CAP_H,
177 AZIMUTH = 1U<<9 | CAP_NONE,
182 DISTANCE = 1U<<10 | CAP_E,
188 DISTANCE_IN = 1U<<11 | CAP_E,
193 REDUCEDLENGTH = 1U<<12 | CAP_D,
198 GEODESICSCALE = 1U<<13 | CAP_D,
203 AREA = 1U<<14 | CAP_C4,
209 LONG_UNROLL = 1U<<15,
211 LONG_NOWRAP = LONG_UNROLL,
218 ALL = OUT_ALL| CAP_ALL,
276 real& lat2, real& lon2, real& azi2,
277 real& m12, real& M12, real& M21, real& S12)
280 return GenDirect(lat1, lon1, azi1,
false, s12,
281 LATITUDE | LONGITUDE | AZIMUTH |
282 REDUCEDLENGTH | GEODESICSCALE | AREA,
283 lat2, lon2, azi2, t, m12, M12, M21, S12);
290 real& lat2, real& lon2)
293 return GenDirect(lat1, lon1, azi1,
false, s12,
294 LATITUDE | LONGITUDE,
295 lat2, lon2, t, t, t, t, t, t);
302 real& lat2, real& lon2, real& azi2)
305 return GenDirect(lat1, lon1, azi1,
false, s12,
306 LATITUDE | LONGITUDE | AZIMUTH,
307 lat2, lon2, azi2, t, t, t, t, t);
314 real& lat2, real& lon2, real& azi2, real& m12)
317 return GenDirect(lat1, lon1, azi1,
false, s12,
318 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
319 lat2, lon2, azi2, t, m12, t, t, t);
326 real& lat2, real& lon2, real& azi2,
327 real& M12, real& M21)
330 return GenDirect(lat1, lon1, azi1,
false, s12,
331 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
332 lat2, lon2, azi2, t, t, M12, M21, t);
339 real& lat2, real& lon2, real& azi2,
340 real& m12, real& M12, real& M21)
343 return GenDirect(lat1, lon1, azi1,
false, s12,
344 LATITUDE | LONGITUDE | AZIMUTH |
345 REDUCEDLENGTH | GEODESICSCALE,
346 lat2, lon2, azi2, t, m12, M12, M21, t);
387 void ArcDirect(real lat1, real lon1, real azi1, real a12,
388 real& lat2, real& lon2, real& azi2, real& s12,
389 real& m12, real& M12, real& M21, real& S12)
391 GenDirect(lat1, lon1, azi1,
true, a12,
392 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
393 REDUCEDLENGTH | GEODESICSCALE | AREA,
394 lat2, lon2, azi2, s12, m12, M12, M21, S12);
400 void ArcDirect(real lat1, real lon1, real azi1, real a12,
401 real& lat2, real& lon2)
const {
403 GenDirect(lat1, lon1, azi1,
true, a12,
404 LATITUDE | LONGITUDE,
405 lat2, lon2, t, t, t, t, t, t);
411 void ArcDirect(real lat1, real lon1, real azi1, real a12,
412 real& lat2, real& lon2, real& azi2)
const {
414 GenDirect(lat1, lon1, azi1,
true, a12,
415 LATITUDE | LONGITUDE | AZIMUTH,
416 lat2, lon2, azi2, t, t, t, t, t);
422 void ArcDirect(real lat1, real lon1, real azi1, real a12,
423 real& lat2, real& lon2, real& azi2, real& s12)
426 GenDirect(lat1, lon1, azi1,
true, a12,
427 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
428 lat2, lon2, azi2, s12, t, t, t, t);
434 void ArcDirect(real lat1, real lon1, real azi1, real a12,
435 real& lat2, real& lon2, real& azi2,
436 real& s12, real& m12)
const {
438 GenDirect(lat1, lon1, azi1,
true, a12,
439 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
441 lat2, lon2, azi2, s12, m12, t, t, t);
447 void ArcDirect(real lat1, real lon1, real azi1, real a12,
448 real& lat2, real& lon2, real& azi2, real& s12,
449 real& M12, real& M21)
const {
451 GenDirect(lat1, lon1, azi1,
true, a12,
452 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
454 lat2, lon2, azi2, s12, t, M12, M21, t);
460 void ArcDirect(real lat1, real lon1, real azi1, real a12,
461 real& lat2, real& lon2, real& azi2, real& s12,
462 real& m12, real& M12, real& M21)
const {
464 GenDirect(lat1, lon1, azi1,
true, a12,
465 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
466 REDUCEDLENGTH | GEODESICSCALE,
467 lat2, lon2, azi2, s12, m12, M12, M21, t);
525 Math::real GenDirect(real lat1, real lon1, real azi1,
526 bool arcmode, real s12_a12,
unsigned outmask,
527 real& lat2, real& lon2, real& azi2,
528 real& s12, real& m12, real& M12, real& M21,
566 real& s12, real& azi1, real& azi2, real& m12,
567 real& M12, real& M21, real& S12)
const {
568 return GenInverse(lat1, lon1, lat2, lon2,
570 REDUCEDLENGTH | GEODESICSCALE | AREA,
571 s12, azi1, azi2, m12, M12, M21, S12);
580 return GenInverse(lat1, lon1, lat2, lon2,
582 s12, t, t, t, t, t, t);
589 real& azi1, real& azi2)
const {
591 return GenInverse(lat1, lon1, lat2, lon2,
593 t, azi1, azi2, t, t, t, t);
600 real& s12, real& azi1, real& azi2)
603 return GenInverse(lat1, lon1, lat2, lon2,
605 s12, azi1, azi2, t, t, t, t);
612 real& s12, real& azi1, real& azi2, real& m12)
615 return GenInverse(lat1, lon1, lat2, lon2,
616 DISTANCE | AZIMUTH | REDUCEDLENGTH,
617 s12, azi1, azi2, m12, t, t, t);
624 real& s12, real& azi1, real& azi2,
625 real& M12, real& M21)
const {
627 return GenInverse(lat1, lon1, lat2, lon2,
628 DISTANCE | AZIMUTH | GEODESICSCALE,
629 s12, azi1, azi2, t, M12, M21, t);
636 real& s12, real& azi1, real& azi2, real& m12,
637 real& M12, real& M21)
const {
639 return GenInverse(lat1, lon1, lat2, lon2,
641 REDUCEDLENGTH | GEODESICSCALE,
642 s12, azi1, azi2, m12, M12, M21, t);
682 Math::real GenInverse(real lat1, real lon1, real lat2, real lon2,
684 real& s12, real& azi1, real& azi2,
685 real& m12, real& M12, real& M21, real& S12)
756 Math::real InverseFlattening()
const {
return 1/_f; }
779 #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