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)))
182 static const int nA3x_ = nA3_;
184 static const int nC3x_ = (nC3_ * (nC3_ - 1)) / 2;
186 static const int nC4x_ = (nC4_ * (nC4_ + 1)) / 2;
187 static const unsigned maxit1_ = 20;
189 real tiny_, tol0_, tol1_, tol2_, tolb_, xthresh_;
202 static real SinCosSeries(
bool sinp,
203 real sinx, real cosx,
const real c[],
int n);
204 static inline real AngRound(real x) {
211 const real z = 1/
real(16);
214 y = y < z ? z - (z - y) : y;
215 return x < 0 ? -y : y;
217 static inline void SinCosNorm(real& sinx, real& cosx) {
222 static real Astroid(real x, real y);
224 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
225 real _A3x[nA3x_], _C3x[nC3x_], _C4x[nC4x_];
227 void Lengths(real eps, real sig12,
228 real ssig1, real csig1, real dn1,
229 real ssig2, real csig2, real dn2,
230 real cbet1, real cbet2,
231 real& s12s, real& m12a, real& m0,
232 bool scalep, real& M12, real& M21,
233 real C1a[], real C2a[])
const;
234 real InverseStart(real sbet1, real cbet1, real dn1,
235 real sbet2, real cbet2, real dn2,
237 real& salp1, real& calp1,
238 real& salp2, real& calp2, real& dnm,
239 real C1a[], real C2a[])
const;
240 real Lambda12(real sbet1, real cbet1, real dn1,
241 real sbet2, real cbet2, real dn2,
242 real salp1, real calp1,
243 real& salp2, real& calp2, real& sig12,
244 real& ssig1, real& csig1, real& ssig2, real& csig2,
245 real& eps, real& domg12,
bool diffp, real& dlam12,
246 real C1a[], real C2a[], real C3a[])
251 static real A1m1f(real eps);
252 static void C1f(real eps, real c[]);
253 static void C1pf(real eps, real c[]);
254 static real A2m1f(real eps);
255 static void C2f(real eps, real c[]);
258 real A3f(real eps)
const;
260 void C3f(real eps, real c[])
const;
262 void C4f(real k2, real c[])
const;
285 LATITUDE = 1U<<7 | CAP_NONE,
290 LONGITUDE = 1U<<8 | CAP_C3,
297 AZIMUTH = 1U<<9 | CAP_NONE,
302 DISTANCE = 1U<<10 | CAP_C1,
308 DISTANCE_IN = 1U<<11 | CAP_C1 | CAP_C1p,
313 REDUCEDLENGTH = 1U<<12 | CAP_C1 | CAP_C2,
318 GEODESICSCALE = 1U<<13 | CAP_C1 | CAP_C2,
323 AREA = 1U<<14 | CAP_C4,
328 ALL = OUT_ALL| CAP_ALL,
387 real& lat2, real& lon2, real& azi2,
388 real& m12, real& M12, real& M21, real& S12)
391 return GenDirect(lat1, lon1, azi1,
false, s12,
392 LATITUDE | LONGITUDE | AZIMUTH |
393 REDUCEDLENGTH | GEODESICSCALE | AREA,
394 lat2, lon2, azi2, t, m12, M12, M21, S12);
401 real& lat2, real& lon2)
404 return GenDirect(lat1, lon1, azi1,
false, s12,
405 LATITUDE | LONGITUDE,
406 lat2, lon2, t, t, t, t, t, t);
413 real& lat2, real& lon2, real& azi2)
416 return GenDirect(lat1, lon1, azi1,
false, s12,
417 LATITUDE | LONGITUDE | AZIMUTH,
418 lat2, lon2, azi2, t, t, t, t, t);
425 real& lat2, real& lon2, real& azi2, real& m12)
428 return GenDirect(lat1, lon1, azi1,
false, s12,
429 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
430 lat2, lon2, azi2, t, m12, t, t, t);
437 real& lat2, real& lon2, real& azi2,
438 real& M12, real& M21)
441 return GenDirect(lat1, lon1, azi1,
false, s12,
442 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
443 lat2, lon2, azi2, t, t, M12, M21, t);
450 real& lat2, real& lon2, real& azi2,
451 real& m12, real& M12, real& M21)
454 return GenDirect(lat1, lon1, azi1,
false, s12,
455 LATITUDE | LONGITUDE | AZIMUTH |
456 REDUCEDLENGTH | GEODESICSCALE,
457 lat2, lon2, azi2, t, m12, M12, M21, t);
499 void ArcDirect(real lat1, real lon1, real azi1, real a12,
500 real& lat2, real& lon2, real& azi2, real& s12,
501 real& m12, real& M12, real& M21, real& S12)
503 GenDirect(lat1, lon1, azi1,
true, a12,
504 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
505 REDUCEDLENGTH | GEODESICSCALE | AREA,
506 lat2, lon2, azi2, s12, m12, M12, M21, S12);
512 void ArcDirect(real lat1, real lon1, real azi1, real a12,
513 real& lat2, real& lon2)
const {
515 GenDirect(lat1, lon1, azi1,
true, a12,
516 LATITUDE | LONGITUDE,
517 lat2, lon2, t, t, t, t, t, t);
523 void ArcDirect(real lat1, real lon1, real azi1, real a12,
524 real& lat2, real& lon2, real& azi2)
const {
526 GenDirect(lat1, lon1, azi1,
true, a12,
527 LATITUDE | LONGITUDE | AZIMUTH,
528 lat2, lon2, azi2, t, t, t, t, t);
534 void ArcDirect(real lat1, real lon1, real azi1, real a12,
535 real& lat2, real& lon2, real& azi2, real& s12)
538 GenDirect(lat1, lon1, azi1,
true, a12,
539 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
540 lat2, lon2, azi2, s12, t, t, t, t);
546 void ArcDirect(real lat1, real lon1, real azi1, real a12,
547 real& lat2, real& lon2, real& azi2,
548 real& s12, real& m12)
const {
550 GenDirect(lat1, lon1, azi1,
true, a12,
551 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
553 lat2, lon2, azi2, s12, m12, t, t, t);
559 void ArcDirect(real lat1, real lon1, real azi1, real a12,
560 real& lat2, real& lon2, real& azi2, real& s12,
561 real& M12, real& M21)
const {
563 GenDirect(lat1, lon1, azi1,
true, a12,
564 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
566 lat2, lon2, azi2, s12, t, M12, M21, t);
572 void ArcDirect(real lat1, real lon1, real azi1, real a12,
573 real& lat2, real& lon2, real& azi2, real& s12,
574 real& m12, real& M12, real& M21)
const {
576 GenDirect(lat1, lon1, azi1,
true, a12,
577 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
578 REDUCEDLENGTH | GEODESICSCALE,
579 lat2, lon2, azi2, s12, m12, M12, M21, t);
631 Math::real GenDirect(real lat1, real lon1, real azi1,
632 bool arcmode, real s12_a12,
unsigned outmask,
633 real& lat2, real& lon2, real& azi2,
634 real& s12, real& m12, real& M12, real& M21,
678 real& s12, real& azi1, real& azi2, real& m12,
679 real& M12, real& M21, real& S12)
const {
680 return GenInverse(lat1, lon1, lat2, lon2,
682 REDUCEDLENGTH | GEODESICSCALE | AREA,
683 s12, azi1, azi2, m12, M12, M21, S12);
692 return GenInverse(lat1, lon1, lat2, lon2,
694 s12, t, t, t, t, t, t);
701 real& azi1, real& azi2)
const {
703 return GenInverse(lat1, lon1, lat2, lon2,
705 t, azi1, azi2, t, t, t, t);
712 real& s12, real& azi1, real& azi2)
715 return GenInverse(lat1, lon1, lat2, lon2,
717 s12, azi1, azi2, t, t, t, t);
724 real& s12, real& azi1, real& azi2, real& m12)
727 return GenInverse(lat1, lon1, lat2, lon2,
728 DISTANCE | AZIMUTH | REDUCEDLENGTH,
729 s12, azi1, azi2, m12, t, t, t);
736 real& s12, real& azi1, real& azi2,
737 real& M12, real& M21)
const {
739 return GenInverse(lat1, lon1, lat2, lon2,
740 DISTANCE | AZIMUTH | GEODESICSCALE,
741 s12, azi1, azi2, t, M12, M21, t);
748 real& s12, real& azi1, real& azi2, real& m12,
749 real& M12, real& M21)
const {
751 return GenInverse(lat1, lon1, lat2, lon2,
753 REDUCEDLENGTH | GEODESICSCALE,
754 s12, azi1, azi2, m12, M12, M21, t);
794 Math::real GenInverse(real lat1, real lon1, real lat2, real lon2,
796 real& s12, real& azi1, real& azi2,
797 real& m12, real& M12, real& M21, real& S12)
842 GeodesicLine Line(real lat1, real lon1, real azi1,
unsigned caps = ALL)
868 Math::real InverseFlattening()
const {
return 1/_f; }
891 #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