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 inline real AngRound(real x) {
212 const real z = 1/
real(16);
215 y = y < z ? z - (z - y) : y;
216 return x < 0 ? -y : y;
218 static inline void SinCosNorm(real& sinx, real& cosx) {
223 static real Astroid(real x, real y);
225 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
226 real _A3x[nA3x_], _C3x[nC3x_], _C4x[nC4x_];
228 void Lengths(real eps, real sig12,
229 real ssig1, real csig1, real dn1,
230 real ssig2, real csig2, real dn2,
231 real cbet1, real cbet2,
232 real& s12s, real& m12a, real& m0,
233 bool scalep, real& M12, real& M21,
234 real C1a[], real C2a[])
const;
235 real InverseStart(real sbet1, real cbet1, real dn1,
236 real sbet2, real cbet2, real dn2,
238 real& salp1, real& calp1,
239 real& salp2, real& calp2, real& dnm,
240 real C1a[], real C2a[])
const;
241 real Lambda12(real sbet1, real cbet1, real dn1,
242 real sbet2, real cbet2, real dn2,
243 real salp1, real calp1,
244 real& salp2, real& calp2, real& sig12,
245 real& ssig1, real& csig1, real& ssig2, real& csig2,
246 real& eps, real& domg12,
bool diffp, real& dlam12,
247 real C1a[], real C2a[], real C3a[])
252 static real A1m1f(real eps);
253 static void C1f(real eps, real c[]);
254 static void C1pf(real eps, real c[]);
255 static real A2m1f(real eps);
256 static void C2f(real eps, real c[]);
259 real A3f(real eps)
const;
261 void C3f(real eps, real c[])
const;
263 void C4f(real k2, real c[])
const;
286 LATITUDE = 1U<<7 | CAP_NONE,
291 LONGITUDE = 1U<<8 | CAP_C3,
298 AZIMUTH = 1U<<9 | CAP_NONE,
303 DISTANCE = 1U<<10 | CAP_C1,
309 DISTANCE_IN = 1U<<11 | CAP_C1 | CAP_C1p,
314 REDUCEDLENGTH = 1U<<12 | CAP_C1 | CAP_C2,
319 GEODESICSCALE = 1U<<13 | CAP_C1 | CAP_C2,
324 AREA = 1U<<14 | CAP_C4,
329 LONG_NOWRAP = 1U<<15,
335 ALL = OUT_ALL| CAP_ALL,
394 real& lat2, real& lon2, real& azi2,
395 real& m12, real& M12, real& M21, real& S12)
398 return GenDirect(lat1, lon1, azi1,
false, s12,
399 LATITUDE | LONGITUDE | AZIMUTH |
400 REDUCEDLENGTH | GEODESICSCALE | AREA,
401 lat2, lon2, azi2, t, m12, M12, M21, S12);
408 real& lat2, real& lon2)
411 return GenDirect(lat1, lon1, azi1,
false, s12,
412 LATITUDE | LONGITUDE,
413 lat2, lon2, t, t, t, t, t, t);
420 real& lat2, real& lon2, real& azi2)
423 return GenDirect(lat1, lon1, azi1,
false, s12,
424 LATITUDE | LONGITUDE | AZIMUTH,
425 lat2, lon2, azi2, t, t, t, t, t);
432 real& lat2, real& lon2, real& azi2, real& m12)
435 return GenDirect(lat1, lon1, azi1,
false, s12,
436 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
437 lat2, lon2, azi2, t, m12, t, t, t);
444 real& lat2, real& lon2, real& azi2,
445 real& M12, real& M21)
448 return GenDirect(lat1, lon1, azi1,
false, s12,
449 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
450 lat2, lon2, azi2, t, t, M12, M21, t);
457 real& lat2, real& lon2, real& azi2,
458 real& m12, real& M12, real& M21)
461 return GenDirect(lat1, lon1, azi1,
false, s12,
462 LATITUDE | LONGITUDE | AZIMUTH |
463 REDUCEDLENGTH | GEODESICSCALE,
464 lat2, lon2, azi2, t, m12, M12, M21, t);
506 void ArcDirect(real lat1, real lon1, real azi1, real a12,
507 real& lat2, real& lon2, real& azi2, real& s12,
508 real& m12, real& M12, real& M21, real& S12)
510 GenDirect(lat1, lon1, azi1,
true, a12,
511 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
512 REDUCEDLENGTH | GEODESICSCALE | AREA,
513 lat2, lon2, azi2, s12, m12, M12, M21, S12);
519 void ArcDirect(real lat1, real lon1, real azi1, real a12,
520 real& lat2, real& lon2)
const {
522 GenDirect(lat1, lon1, azi1,
true, a12,
523 LATITUDE | LONGITUDE,
524 lat2, lon2, t, t, t, t, t, t);
530 void ArcDirect(real lat1, real lon1, real azi1, real a12,
531 real& lat2, real& lon2, real& azi2)
const {
533 GenDirect(lat1, lon1, azi1,
true, a12,
534 LATITUDE | LONGITUDE | AZIMUTH,
535 lat2, lon2, azi2, t, t, t, t, t);
541 void ArcDirect(real lat1, real lon1, real azi1, real a12,
542 real& lat2, real& lon2, real& azi2, real& s12)
545 GenDirect(lat1, lon1, azi1,
true, a12,
546 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
547 lat2, lon2, azi2, s12, t, t, t, t);
553 void ArcDirect(real lat1, real lon1, real azi1, real a12,
554 real& lat2, real& lon2, real& azi2,
555 real& s12, real& m12)
const {
557 GenDirect(lat1, lon1, azi1,
true, a12,
558 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
560 lat2, lon2, azi2, s12, m12, t, t, t);
566 void ArcDirect(real lat1, real lon1, real azi1, real a12,
567 real& lat2, real& lon2, real& azi2, real& s12,
568 real& M12, real& M21)
const {
570 GenDirect(lat1, lon1, azi1,
true, a12,
571 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
573 lat2, lon2, azi2, s12, t, M12, M21, t);
579 void ArcDirect(real lat1, real lon1, real azi1, real a12,
580 real& lat2, real& lon2, real& azi2, real& s12,
581 real& m12, real& M12, real& M21)
const {
583 GenDirect(lat1, lon1, azi1,
true, a12,
584 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
585 REDUCEDLENGTH | GEODESICSCALE,
586 lat2, lon2, azi2, s12, m12, M12, M21, t);
646 Math::real GenDirect(real lat1, real lon1, real azi1,
647 bool arcmode, real s12_a12,
unsigned outmask,
648 real& lat2, real& lon2, real& azi2,
649 real& s12, real& m12, real& M12, real& M21,
693 real& s12, real& azi1, real& azi2, real& m12,
694 real& M12, real& M21, real& S12)
const {
695 return GenInverse(lat1, lon1, lat2, lon2,
697 REDUCEDLENGTH | GEODESICSCALE | AREA,
698 s12, azi1, azi2, m12, M12, M21, S12);
707 return GenInverse(lat1, lon1, lat2, lon2,
709 s12, t, t, t, t, t, t);
716 real& azi1, real& azi2)
const {
718 return GenInverse(lat1, lon1, lat2, lon2,
720 t, azi1, azi2, t, t, t, t);
727 real& s12, real& azi1, real& azi2)
730 return GenInverse(lat1, lon1, lat2, lon2,
732 s12, azi1, azi2, t, t, t, t);
739 real& s12, real& azi1, real& azi2, real& m12)
742 return GenInverse(lat1, lon1, lat2, lon2,
743 DISTANCE | AZIMUTH | REDUCEDLENGTH,
744 s12, azi1, azi2, m12, t, t, t);
751 real& s12, real& azi1, real& azi2,
752 real& M12, real& M21)
const {
754 return GenInverse(lat1, lon1, lat2, lon2,
755 DISTANCE | AZIMUTH | GEODESICSCALE,
756 s12, azi1, azi2, t, M12, M21, t);
763 real& s12, real& azi1, real& azi2, real& m12,
764 real& M12, real& M21)
const {
766 return GenInverse(lat1, lon1, lat2, lon2,
768 REDUCEDLENGTH | GEODESICSCALE,
769 s12, azi1, azi2, m12, M12, M21, t);
809 Math::real GenInverse(real lat1, real lon1, real lat2, real lon2,
811 real& s12, real& azi1, real& azi2,
812 real& m12, real& M12, real& M21, real& S12)
857 GeodesicLine Line(real lat1, real lon1, real azi1,
unsigned caps = ALL)
883 Math::real InverseFlattening()
const {
return 1/_f; }
906 #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
#define GEOGRAPHICLIB_VOLATILE
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