10 #if !defined(GEOGRAPHICLIB_GEODESIC_HPP)
11 #define GEOGRAPHICLIB_GEODESIC_HPP 1
15 #if !defined(GEOGRAPHICLIB_GEODESIC_ORDER)
20 # define GEOGRAPHICLIB_GEODESIC_ORDER \
21 (GEOGRAPHICLIB_PRECISION == 2 ? 6 : \
22 (GEOGRAPHICLIB_PRECISION == 1 ? 3 : \
23 (GEOGRAPHICLIB_PRECISION == 3 ? 7 : 8)))
181 static const int nA3x_ = nA3_;
183 static const int nC3x_ = (nC3_ * (nC3_ - 1)) / 2;
185 static const int nC4x_ = (nC4_ * (nC4_ + 1)) / 2;
186 static const unsigned maxit1_ = 20;
188 real tiny_, tol0_, tol1_, tol2_, tolb_, xthresh_;
203 static real SinCosSeries(
bool sinp,
204 real sinx, real cosx,
const real c[],
int n);
205 static real Astroid(real x, real y);
207 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
208 real _A3x[nA3x_], _C3x[nC3x_], _C4x[nC4x_];
210 void Lengths(real eps, real sig12,
211 real ssig1, real csig1, real dn1,
212 real ssig2, real csig2, real dn2,
213 real cbet1, real cbet2,
214 real& s12s, real& m12a, real& m0,
215 bool scalep, real& M12, real& M21,
216 real C1a[], real C2a[])
const;
217 real InverseStart(real sbet1, real cbet1, real dn1,
218 real sbet2, real cbet2, real dn2,
220 real& salp1, real& calp1,
221 real& salp2, real& calp2, real& dnm,
222 real C1a[], real C2a[])
const;
223 real Lambda12(real sbet1, real cbet1, real dn1,
224 real sbet2, real cbet2, real dn2,
225 real salp1, real calp1,
226 real& salp2, real& calp2, real& sig12,
227 real& ssig1, real& csig1, real& ssig2, real& csig2,
228 real& eps, real& domg12,
bool diffp, real& dlam12,
229 real C1a[], real C2a[], real C3a[])
234 static real A1m1f(real eps);
235 static void C1f(real eps, real c[]);
236 static void C1pf(real eps, real c[]);
237 static real A2m1f(real eps);
238 static void C2f(real eps, real c[]);
241 real A3f(real eps)
const;
243 void C3f(real eps, real c[])
const;
245 void C4f(real k2, real c[])
const;
268 LATITUDE = 1U<<7 | CAP_NONE,
273 LONGITUDE = 1U<<8 | CAP_C3,
280 AZIMUTH = 1U<<9 | CAP_NONE,
285 DISTANCE = 1U<<10 | CAP_C1,
291 DISTANCE_IN = 1U<<11 | CAP_C1 | CAP_C1p,
296 REDUCEDLENGTH = 1U<<12 | CAP_C1 | CAP_C2,
301 GEODESICSCALE = 1U<<13 | CAP_C1 | CAP_C2,
306 AREA = 1U<<14 | CAP_C4,
311 LONG_NOWRAP = 1U<<15,
317 ALL = OUT_ALL| CAP_ALL,
376 real& lat2, real& lon2, real& azi2,
377 real& m12, real& M12, real& M21, real& S12)
380 return GenDirect(lat1, lon1, azi1,
false, s12,
381 LATITUDE | LONGITUDE | AZIMUTH |
382 REDUCEDLENGTH | GEODESICSCALE | AREA,
383 lat2, lon2, azi2, t, m12, M12, M21, S12);
390 real& lat2, real& lon2)
393 return GenDirect(lat1, lon1, azi1,
false, s12,
394 LATITUDE | LONGITUDE,
395 lat2, lon2, t, t, t, t, t, t);
402 real& lat2, real& lon2, real& azi2)
405 return GenDirect(lat1, lon1, azi1,
false, s12,
406 LATITUDE | LONGITUDE | AZIMUTH,
407 lat2, lon2, azi2, t, t, t, t, t);
414 real& lat2, real& lon2, real& azi2, real& m12)
417 return GenDirect(lat1, lon1, azi1,
false, s12,
418 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
419 lat2, lon2, azi2, t, m12, t, t, t);
426 real& lat2, real& lon2, real& azi2,
427 real& M12, real& M21)
430 return GenDirect(lat1, lon1, azi1,
false, s12,
431 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
432 lat2, lon2, azi2, t, t, M12, M21, t);
439 real& lat2, real& lon2, real& azi2,
440 real& m12, real& M12, real& M21)
443 return GenDirect(lat1, lon1, azi1,
false, s12,
444 LATITUDE | LONGITUDE | AZIMUTH |
445 REDUCEDLENGTH | GEODESICSCALE,
446 lat2, lon2, azi2, t, m12, M12, M21, t);
488 void ArcDirect(real lat1, real lon1, real azi1, real a12,
489 real& lat2, real& lon2, real& azi2, real& s12,
490 real& m12, real& M12, real& M21, real& S12)
492 GenDirect(lat1, lon1, azi1,
true, a12,
493 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
494 REDUCEDLENGTH | GEODESICSCALE | AREA,
495 lat2, lon2, azi2, s12, m12, M12, M21, S12);
501 void ArcDirect(real lat1, real lon1, real azi1, real a12,
502 real& lat2, real& lon2)
const {
504 GenDirect(lat1, lon1, azi1,
true, a12,
505 LATITUDE | LONGITUDE,
506 lat2, lon2, t, t, t, t, t, t);
512 void ArcDirect(real lat1, real lon1, real azi1, real a12,
513 real& lat2, real& lon2, real& azi2)
const {
515 GenDirect(lat1, lon1, azi1,
true, a12,
516 LATITUDE | LONGITUDE | AZIMUTH,
517 lat2, lon2, azi2, t, t, t, t, t);
523 void ArcDirect(real lat1, real lon1, real azi1, real a12,
524 real& lat2, real& lon2, real& azi2, real& s12)
527 GenDirect(lat1, lon1, azi1,
true, a12,
528 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
529 lat2, lon2, azi2, s12, t, t, t, t);
535 void ArcDirect(real lat1, real lon1, real azi1, real a12,
536 real& lat2, real& lon2, real& azi2,
537 real& s12, real& m12)
const {
539 GenDirect(lat1, lon1, azi1,
true, a12,
540 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
542 lat2, lon2, azi2, s12, m12, t, t, t);
548 void ArcDirect(real lat1, real lon1, real azi1, real a12,
549 real& lat2, real& lon2, real& azi2, real& s12,
550 real& M12, real& M21)
const {
552 GenDirect(lat1, lon1, azi1,
true, a12,
553 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
555 lat2, lon2, azi2, s12, t, M12, M21, t);
561 void ArcDirect(real lat1, real lon1, real azi1, real a12,
562 real& lat2, real& lon2, real& azi2, real& s12,
563 real& m12, real& M12, real& M21)
const {
565 GenDirect(lat1, lon1, azi1,
true, a12,
566 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
567 REDUCEDLENGTH | GEODESICSCALE,
568 lat2, lon2, azi2, s12, m12, M12, M21, t);
628 Math::real GenDirect(real lat1, real lon1, real azi1,
629 bool arcmode, real s12_a12,
unsigned outmask,
630 real& lat2, real& lon2, real& azi2,
631 real& s12, real& m12, real& M12, real& M21,
675 real& s12, real& azi1, real& azi2, real& m12,
676 real& M12, real& M21, real& S12)
const {
677 return GenInverse(lat1, lon1, lat2, lon2,
679 REDUCEDLENGTH | GEODESICSCALE | AREA,
680 s12, azi1, azi2, m12, M12, M21, S12);
689 return GenInverse(lat1, lon1, lat2, lon2,
691 s12, t, t, t, t, t, t);
698 real& azi1, real& azi2)
const {
700 return GenInverse(lat1, lon1, lat2, lon2,
702 t, azi1, azi2, t, t, t, t);
709 real& s12, real& azi1, real& azi2)
712 return GenInverse(lat1, lon1, lat2, lon2,
714 s12, azi1, azi2, t, t, t, t);
721 real& s12, real& azi1, real& azi2, real& m12)
724 return GenInverse(lat1, lon1, lat2, lon2,
725 DISTANCE | AZIMUTH | REDUCEDLENGTH,
726 s12, azi1, azi2, m12, t, t, t);
733 real& s12, real& azi1, real& azi2,
734 real& M12, real& M21)
const {
736 return GenInverse(lat1, lon1, lat2, lon2,
737 DISTANCE | AZIMUTH | GEODESICSCALE,
738 s12, azi1, azi2, t, M12, M21, t);
745 real& s12, real& azi1, real& azi2, real& m12,
746 real& M12, real& M21)
const {
748 return GenInverse(lat1, lon1, lat2, lon2,
750 REDUCEDLENGTH | GEODESICSCALE,
751 s12, azi1, azi2, m12, M12, M21, t);
791 Math::real GenInverse(real lat1, real lon1, real lat2, real lon2,
793 real& s12, real& azi1, real& azi2,
794 real& m12, real& M12, real& M21, real& S12)
839 GeodesicLine Line(real lat1, real lon1, real azi1,
unsigned caps = ALL)
865 Math::real InverseFlattening()
const {
return 1/_f; }
888 #endif // GEOGRAPHICLIB_GEODESIC_HPP
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2, real &s12, real &M12, real &M21) const
#define GEOGRAPHICLIB_EXPORT
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 &M12, real &M21, real &S12) const
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2, real &azi2, real &m12) const
GeographicLib::Math::real real
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
Math::real MajorRadius() const
void ArcDirect(real lat1, real lon1, real azi1, real a12, 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 &M12, real &M21) const
Math::real Direct(real lat1, real lon1, real azi1, real s12, 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 Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2, real &m12) 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
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2) const
Namespace for GeographicLib.
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12) const
Math::real EllipsoidArea() const
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, 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, real &S12) 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
Header for GeographicLib::Constants class.
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &azi1, real &azi2) const
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2, real &s12) const
#define GEOGRAPHICLIB_GEODESIC_ORDER
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 &M21) const
Math::real Flattening() const