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;
189 static const unsigned maxit1_ = 20;
191 real tiny_, tol0_, tol1_, tol2_, tolb_, xthresh_;
206 static real SinCosSeries(
bool sinp,
207 real sinx, real cosx,
const real c[],
int n);
208 static real Astroid(real x, real y);
210 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
211 real _A3x[nA3x_], _C3x[nC3x_], _C4x[nC4x_];
213 void Lengths(real eps, real sig12,
214 real ssig1, real csig1, real dn1,
215 real ssig2, real csig2, real dn2,
216 real cbet1, real cbet2,
unsigned outmask,
217 real& s12s, real& m12a, real& m0,
218 real& M12, real& M21, real Ca[])
const;
219 real InverseStart(real sbet1, real cbet1, real dn1,
220 real sbet2, real cbet2, real dn2,
222 real& salp1, real& calp1,
223 real& salp2, real& calp2, real& dnm,
225 real Lambda12(real sbet1, real cbet1, real dn1,
226 real sbet2, real cbet2, real dn2,
227 real salp1, real calp1,
228 real& salp2, real& calp2, real& sig12,
229 real& ssig1, real& csig1, real& ssig2, real& csig2,
230 real& eps, real& domg12,
bool diffp, real& dlam12,
236 static real A1m1f(real eps);
237 static void C1f(real eps, real c[]);
238 static void C1pf(real eps, real c[]);
239 static real A2m1f(real eps);
240 static void C2f(real eps, real c[]);
243 real A3f(real eps)
const;
245 void C3f(real eps, real c[])
const;
247 void C4f(real k2, real c[])
const;
270 LATITUDE = 1U<<7 | CAP_NONE,
275 LONGITUDE = 1U<<8 | CAP_C3,
282 AZIMUTH = 1U<<9 | CAP_NONE,
287 DISTANCE = 1U<<10 | CAP_C1,
293 DISTANCE_IN = 1U<<11 | CAP_C1 | CAP_C1p,
298 REDUCEDLENGTH = 1U<<12 | CAP_C1 | CAP_C2,
303 GEODESICSCALE = 1U<<13 | CAP_C1 | CAP_C2,
308 AREA = 1U<<14 | CAP_C4,
314 LONG_UNROLL = 1U<<15,
316 LONG_NOWRAP = LONG_UNROLL,
323 ALL = OUT_ALL| CAP_ALL,
381 real& lat2, real& lon2, real& azi2,
382 real& m12, real& M12, real& M21, real& S12)
385 return GenDirect(lat1, lon1, azi1,
false, s12,
386 LATITUDE | LONGITUDE | AZIMUTH |
387 REDUCEDLENGTH | GEODESICSCALE | AREA,
388 lat2, lon2, azi2, t, m12, M12, M21, S12);
395 real& lat2, real& lon2)
398 return GenDirect(lat1, lon1, azi1,
false, s12,
399 LATITUDE | LONGITUDE,
400 lat2, lon2, t, t, t, t, t, t);
407 real& lat2, real& lon2, real& azi2)
410 return GenDirect(lat1, lon1, azi1,
false, s12,
411 LATITUDE | LONGITUDE | AZIMUTH,
412 lat2, lon2, azi2, t, t, t, t, t);
419 real& lat2, real& lon2, real& azi2, real& m12)
422 return GenDirect(lat1, lon1, azi1,
false, s12,
423 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
424 lat2, lon2, azi2, t, m12, t, t, t);
431 real& lat2, real& lon2, real& azi2,
432 real& M12, real& M21)
435 return GenDirect(lat1, lon1, azi1,
false, s12,
436 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
437 lat2, lon2, azi2, t, t, M12, M21, t);
444 real& lat2, real& lon2, real& azi2,
445 real& m12, real& M12, real& M21)
448 return GenDirect(lat1, lon1, azi1,
false, s12,
449 LATITUDE | LONGITUDE | AZIMUTH |
450 REDUCEDLENGTH | GEODESICSCALE,
451 lat2, lon2, azi2, t, m12, M12, M21, t);
492 void ArcDirect(real lat1, real lon1, real azi1, real a12,
493 real& lat2, real& lon2, real& azi2, real& s12,
494 real& m12, real& M12, real& M21, real& S12)
496 GenDirect(lat1, lon1, azi1,
true, a12,
497 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
498 REDUCEDLENGTH | GEODESICSCALE | AREA,
499 lat2, lon2, azi2, s12, m12, M12, M21, S12);
505 void ArcDirect(real lat1, real lon1, real azi1, real a12,
506 real& lat2, real& lon2)
const {
508 GenDirect(lat1, lon1, azi1,
true, a12,
509 LATITUDE | LONGITUDE,
510 lat2, lon2, t, t, t, t, t, t);
516 void ArcDirect(real lat1, real lon1, real azi1, real a12,
517 real& lat2, real& lon2, real& azi2)
const {
519 GenDirect(lat1, lon1, azi1,
true, a12,
520 LATITUDE | LONGITUDE | AZIMUTH,
521 lat2, lon2, azi2, t, t, t, t, t);
527 void ArcDirect(real lat1, real lon1, real azi1, real a12,
528 real& lat2, real& lon2, real& azi2, real& s12)
531 GenDirect(lat1, lon1, azi1,
true, a12,
532 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
533 lat2, lon2, azi2, s12, t, t, t, t);
539 void ArcDirect(real lat1, real lon1, real azi1, real a12,
540 real& lat2, real& lon2, real& azi2,
541 real& s12, real& m12)
const {
543 GenDirect(lat1, lon1, azi1,
true, a12,
544 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
546 lat2, lon2, azi2, s12, m12, t, t, t);
552 void ArcDirect(real lat1, real lon1, real azi1, real a12,
553 real& lat2, real& lon2, real& azi2, real& s12,
554 real& M12, real& M21)
const {
556 GenDirect(lat1, lon1, azi1,
true, a12,
557 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
559 lat2, lon2, azi2, s12, t, M12, M21, t);
565 void ArcDirect(real lat1, real lon1, real azi1, real a12,
566 real& lat2, real& lon2, real& azi2, real& s12,
567 real& m12, real& M12, real& M21)
const {
569 GenDirect(lat1, lon1, azi1,
true, a12,
570 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
571 REDUCEDLENGTH | GEODESICSCALE,
572 lat2, lon2, azi2, s12, m12, M12, M21, t);
630 Math::real GenDirect(real lat1, real lon1, real azi1,
631 bool arcmode, real s12_a12,
unsigned outmask,
632 real& lat2, real& lon2, real& azi2,
633 real& s12, real& m12, real& M12, real& M21,
676 real& s12, real& azi1, real& azi2, real& m12,
677 real& M12, real& M21, real& S12)
const {
678 return GenInverse(lat1, lon1, lat2, lon2,
680 REDUCEDLENGTH | GEODESICSCALE | AREA,
681 s12, azi1, azi2, m12, M12, M21, S12);
690 return GenInverse(lat1, lon1, lat2, lon2,
692 s12, t, t, t, t, t, t);
699 real& azi1, real& azi2)
const {
701 return GenInverse(lat1, lon1, lat2, lon2,
703 t, azi1, azi2, t, t, t, t);
710 real& s12, real& azi1, real& azi2)
713 return GenInverse(lat1, lon1, lat2, lon2,
715 s12, azi1, azi2, t, t, t, t);
722 real& s12, real& azi1, real& azi2, real& m12)
725 return GenInverse(lat1, lon1, lat2, lon2,
726 DISTANCE | AZIMUTH | REDUCEDLENGTH,
727 s12, azi1, azi2, m12, t, t, t);
734 real& s12, real& azi1, real& azi2,
735 real& M12, real& M21)
const {
737 return GenInverse(lat1, lon1, lat2, lon2,
738 DISTANCE | AZIMUTH | GEODESICSCALE,
739 s12, azi1, azi2, t, M12, M21, t);
746 real& s12, real& azi1, real& azi2, real& m12,
747 real& M12, real& M21)
const {
749 return GenInverse(lat1, lon1, lat2, lon2,
751 REDUCEDLENGTH | GEODESICSCALE,
752 s12, azi1, azi2, m12, M12, M21, t);
792 Math::real GenInverse(real lat1, real lon1, real lat2, real lon2,
794 real& s12, real& azi1, real& azi2,
795 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