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_;
101 static real CosSeries(real sinx, real cosx,
const real c[],
int n);
102 static inline real AngRound(real x) {
109 const real z = 1/
real(16);
112 y = y < z ? z - (z - y) : y;
113 return x < 0 ? -y : y;
115 static inline void SinCosNorm(real& sinx, real& cosx) {
120 static real Astroid(real x, real y);
122 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
125 void Lengths(
const EllipticFunction& E,
127 real ssig1, real csig1, real dn1,
128 real ssig2, real csig2, real dn2,
129 real cbet1, real cbet2,
130 real& s12s, real& m12a, real& m0,
131 bool scalep, real& M12, real& M21)
const;
132 real InverseStart(EllipticFunction& E,
133 real sbet1, real cbet1, real dn1,
134 real sbet2, real cbet2, real dn2,
136 real& salp1, real& calp1,
137 real& salp2, real& calp2, real& dnm)
const;
138 real Lambda12(real sbet1, real cbet1, real dn1,
139 real sbet2, real cbet2, real dn2,
140 real salp1, real calp1,
141 real& salp2, real& calp2, real& sig12,
142 real& ssig1, real& csig1, real& ssig2, real& csig2,
144 real& omg12,
bool diffp, real& dlam12)
const;
149 void C4f(real k2, real c[])
const;
154 static Math::real inline reale(
long long hi,
long long lo) {
156 return ldexp(
real(hi), 52) + lo;
182 LATITUDE = 1U<<7 | CAP_NONE,
187 LONGITUDE = 1U<<8 | CAP_H,
194 AZIMUTH = 1U<<9 | CAP_NONE,
199 DISTANCE = 1U<<10 | CAP_E,
205 DISTANCE_IN = 1U<<11 | CAP_E,
210 REDUCEDLENGTH = 1U<<12 | CAP_D,
215 GEODESICSCALE = 1U<<13 | CAP_D,
220 AREA = 1U<<14 | CAP_C4,
225 ALL = OUT_ALL| CAP_ALL,
284 real& lat2, real& lon2, real& azi2,
285 real& m12, real& M12, real& M21, real& S12)
288 return GenDirect(lat1, lon1, azi1,
false, s12,
289 LATITUDE | LONGITUDE | AZIMUTH |
290 REDUCEDLENGTH | GEODESICSCALE | AREA,
291 lat2, lon2, azi2, t, m12, M12, M21, S12);
298 real& lat2, real& lon2)
301 return GenDirect(lat1, lon1, azi1,
false, s12,
302 LATITUDE | LONGITUDE,
303 lat2, lon2, t, t, t, t, t, t);
310 real& lat2, real& lon2, real& azi2)
313 return GenDirect(lat1, lon1, azi1,
false, s12,
314 LATITUDE | LONGITUDE | AZIMUTH,
315 lat2, lon2, azi2, t, t, t, t, t);
322 real& lat2, real& lon2, real& azi2, real& m12)
325 return GenDirect(lat1, lon1, azi1,
false, s12,
326 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
327 lat2, lon2, azi2, t, m12, t, t, t);
334 real& lat2, real& lon2, real& azi2,
335 real& M12, real& M21)
338 return GenDirect(lat1, lon1, azi1,
false, s12,
339 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
340 lat2, lon2, azi2, t, t, M12, M21, t);
347 real& lat2, real& lon2, real& azi2,
348 real& m12, real& M12, real& M21)
351 return GenDirect(lat1, lon1, azi1,
false, s12,
352 LATITUDE | LONGITUDE | AZIMUTH |
353 REDUCEDLENGTH | GEODESICSCALE,
354 lat2, lon2, azi2, t, m12, M12, M21, t);
396 void ArcDirect(real lat1, real lon1, real azi1, real a12,
397 real& lat2, real& lon2, real& azi2, real& s12,
398 real& m12, real& M12, real& M21, real& S12)
400 GenDirect(lat1, lon1, azi1,
true, a12,
401 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
402 REDUCEDLENGTH | GEODESICSCALE | AREA,
403 lat2, lon2, azi2, s12, m12, M12, M21, S12);
409 void ArcDirect(real lat1, real lon1, real azi1, real a12,
410 real& lat2, real& lon2)
const {
412 GenDirect(lat1, lon1, azi1,
true, a12,
413 LATITUDE | LONGITUDE,
414 lat2, lon2, t, t, t, t, t, t);
420 void ArcDirect(real lat1, real lon1, real azi1, real a12,
421 real& lat2, real& lon2, real& azi2)
const {
423 GenDirect(lat1, lon1, azi1,
true, a12,
424 LATITUDE | LONGITUDE | AZIMUTH,
425 lat2, lon2, azi2, t, t, t, t, t);
431 void ArcDirect(real lat1, real lon1, real azi1, real a12,
432 real& lat2, real& lon2, real& azi2, real& s12)
435 GenDirect(lat1, lon1, azi1,
true, a12,
436 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
437 lat2, lon2, azi2, s12, t, t, t, t);
443 void ArcDirect(real lat1, real lon1, real azi1, real a12,
444 real& lat2, real& lon2, real& azi2,
445 real& s12, real& m12)
const {
447 GenDirect(lat1, lon1, azi1,
true, a12,
448 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
450 lat2, lon2, azi2, s12, m12, t, t, t);
456 void ArcDirect(real lat1, real lon1, real azi1, real a12,
457 real& lat2, real& lon2, real& azi2, real& s12,
458 real& M12, real& M21)
const {
460 GenDirect(lat1, lon1, azi1,
true, a12,
461 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
463 lat2, lon2, azi2, s12, t, M12, M21, t);
469 void ArcDirect(real lat1, real lon1, real azi1, real a12,
470 real& lat2, real& lon2, real& azi2, real& s12,
471 real& m12, real& M12, real& M21)
const {
473 GenDirect(lat1, lon1, azi1,
true, a12,
474 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
475 REDUCEDLENGTH | GEODESICSCALE,
476 lat2, lon2, azi2, s12, m12, M12, M21, t);
528 Math::real GenDirect(real lat1, real lon1, real azi1,
529 bool arcmode, real s12_a12,
unsigned outmask,
530 real& lat2, real& lon2, real& azi2,
531 real& s12, real& m12, real& M12, real& M21,
570 real& s12, real& azi1, real& azi2, real& m12,
571 real& M12, real& M21, real& S12)
const {
572 return GenInverse(lat1, lon1, lat2, lon2,
574 REDUCEDLENGTH | GEODESICSCALE | AREA,
575 s12, azi1, azi2, m12, M12, M21, S12);
584 return GenInverse(lat1, lon1, lat2, lon2,
586 s12, t, t, t, t, t, t);
593 real& azi1, real& azi2)
const {
595 return GenInverse(lat1, lon1, lat2, lon2,
597 t, azi1, azi2, t, t, t, t);
604 real& s12, real& azi1, real& azi2)
607 return GenInverse(lat1, lon1, lat2, lon2,
609 s12, azi1, azi2, t, t, t, t);
616 real& s12, real& azi1, real& azi2, real& m12)
619 return GenInverse(lat1, lon1, lat2, lon2,
620 DISTANCE | AZIMUTH | REDUCEDLENGTH,
621 s12, azi1, azi2, m12, t, t, t);
628 real& s12, real& azi1, real& azi2,
629 real& M12, real& M21)
const {
631 return GenInverse(lat1, lon1, lat2, lon2,
632 DISTANCE | AZIMUTH | GEODESICSCALE,
633 s12, azi1, azi2, t, M12, M21, t);
640 real& s12, real& azi1, real& azi2, real& m12,
641 real& M12, real& M21)
const {
643 return GenInverse(lat1, lon1, lat2, lon2,
645 REDUCEDLENGTH | GEODESICSCALE,
646 s12, azi1, azi2, m12, M12, M21, t);
686 Math::real GenInverse(real lat1, real lon1, real lat2, real lon2,
688 real& s12, real& azi1, real& azi2,
689 real& m12, real& M12, real& M21, real& S12)
761 Math::real InverseFlattening()
const {
return 1/_f; }
784 #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