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)))
26 namespace GeographicLib {
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,
204 static inline real AngRound(
real x) {
214 y = y < z ? z - (z - y) : y;
215 return x < 0 ? -y : y;
217 static inline void SinCosNorm(
real& sinx,
real& cosx) {
224 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
225 real _A3x[nA3x_], _C3x[nC3x_], _C4x[nC4x_];
252 static void C1f(
real eps,
real c[]);
253 static void C1pf(
real eps,
real c[]);
255 static void C2f(
real eps,
real c[]);
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);
632 bool arcmode,
real s12_a12,
unsigned outmask,
677 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
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);
689 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
692 return GenInverse(lat1, lon1, lat2, lon2,
694 s12, t, t, t, t, t, t);
700 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
701 real& azi1, real& azi2)
const {
703 return GenInverse(lat1, lon1, lat2, lon2,
705 t, azi1, azi2, t, t, t, t);
711 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
712 real& s12, real& azi1, real& azi2)
715 return GenInverse(lat1, lon1, lat2, lon2,
717 s12, azi1, azi2, t, t, t, t);
723 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
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);
735 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
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);
747 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
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);
868 Math::real InverseFlattening()
const {
return 1/_f; }
891 #endif // GEOGRAPHICLIB_GEODESIC_HPP