10#if !defined(GEOGRAPHICLIB_GEODESIC_HPP)
11#define GEOGRAPHICLIB_GEODESIC_HPP 1
16#if !defined(GEOGRAPHICLIB_GEODESIC_ORDER)
21# define GEOGRAPHICLIB_GEODESIC_ORDER \
22 (GEOGRAPHICLIB_PRECISION == 2 ? 6 : \
23 (GEOGRAPHICLIB_PRECISION == 1 ? 3 : \
24 (GEOGRAPHICLIB_PRECISION == 3 ? 7 : 8)))
185 static const int nA3x_ = nA3_;
187 static const int nC3x_ = (nC3_ * (nC3_ - 1)) / 2;
189 static const int nC4x_ = (nC4_ * (nC4_ + 1)) / 2;
193 static const unsigned maxit1_ = 20;
195 real tiny_, tol0_, tol1_, tol2_, tolb_, xthresh_;
197 static constexpr unsigned CAP_NONE = 0U;
198 static constexpr unsigned CAP_C1 = 1U<<0;
199 static constexpr unsigned CAP_C1p = 1U<<1;
200 static constexpr unsigned CAP_C2 = 1U<<2;
201 static constexpr unsigned CAP_C3 = 1U<<3;
202 static constexpr unsigned CAP_C4 = 1U<<4;
203 static constexpr unsigned CAP_ALL = 0x1FU;
204 static constexpr unsigned CAP_MASK = CAP_ALL;
205 static constexpr unsigned OUT_ALL = 0x7F80U;
206 static constexpr unsigned OUT_MASK = 0xFF80U;
208 static real SinCosSeries(
bool sinp,
209 real sinx, real cosx,
const real c[],
int n);
210 static real Astroid(real x, real y);
214 real _f1, _e2, _ep2, _n, _b, _c2, _etol2;
215 real _aA3x[nA3x_], _cC3x[nC3x_], _cC4x[nC4x_];
218 void Lengths(real eps, real sig12,
219 real ssig1, real csig1, real dn1,
220 real ssig2, real csig2, real dn2,
221 real cbet1, real cbet2,
unsigned outmask,
222 real& s12s, real& m12a, real& m0,
223 real& M12, real& M21, real Ca[])
const;
224 real InverseStart(real sbet1, real cbet1, real dn1,
225 real sbet2, real cbet2, real dn2,
226 real lam12, real slam12, real clam12,
227 real& salp1, real& calp1,
228 real& salp2, real& calp2, real& dnm,
230 real Lambda12(real sbet1, real cbet1, real dn1,
231 real sbet2, real cbet2, real dn2,
232 real salp1, real calp1, real slam120, real clam120,
233 real& salp2, real& calp2, real& sig12,
234 real& ssig1, real& csig1, real& ssig2, real& csig2,
235 real& eps, real& domg12,
236 bool diffp, real& dlam12, real Ca[])
const;
237 real GenInverse(real lat1, real lon1, real lat2, real lon2,
238 unsigned outmask, real& s12,
239 real& salp1, real& calp1, real& salp2, real& calp2,
240 real& m12, real& M12, real& M21, real& S12)
const;
244 static real A1m1f(real eps);
245 static void C1f(real eps, real c[]);
246 static void C1pf(real eps, real c[]);
247 static real A2m1f(real eps);
248 static void C2f(real eps, real c[]);
251 real A3f(real eps)
const;
253 void C3f(real eps, real c[])
const;
255 void C4f(real k2, real c[])
const;
277 LATITUDE = 1U<<7 | CAP_NONE,
282 LONGITUDE = 1U<<8 | CAP_C3,
289 AZIMUTH = 1U<<9 | CAP_NONE,
294 DISTANCE = 1U<<10 | CAP_C1,
300 STANDARD = LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
306 DISTANCE_IN = 1U<<11 | CAP_C1 | CAP_C1p,
311 REDUCEDLENGTH = 1U<<12 | CAP_C1 | CAP_C2,
316 GEODESICSCALE = 1U<<13 | CAP_C1 | CAP_C2,
321 AREA = 1U<<14 | CAP_C4,
326 LONG_UNROLL = 1U<<15,
332 ALL = OUT_ALL| CAP_ALL,
395 real& lat2, real& lon2, real& azi2,
396 real& m12, real& M12, real& M21, real& S12)
399 return GenDirect(lat1, lon1, azi1,
false, s12,
400 LATITUDE | LONGITUDE | AZIMUTH |
401 REDUCEDLENGTH | GEODESICSCALE | AREA,
402 lat2, lon2, azi2, t, m12, M12, M21, S12);
409 real& lat2, real& lon2)
412 return GenDirect(lat1, lon1, azi1,
false, s12,
413 LATITUDE | LONGITUDE,
414 lat2, lon2, t, t, t, t, t, t);
421 real& lat2, real& lon2, real& azi2)
424 return GenDirect(lat1, lon1, azi1,
false, s12,
425 LATITUDE | LONGITUDE | AZIMUTH,
426 lat2, lon2, azi2, t, t, t, t, t);
433 real& lat2, real& lon2, real& azi2, real& m12)
436 return GenDirect(lat1, lon1, azi1,
false, s12,
437 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
438 lat2, lon2, azi2, t, m12, t, t, t);
445 real& lat2, real& lon2, real& azi2,
446 real& M12, real& M21)
449 return GenDirect(lat1, lon1, azi1,
false, s12,
450 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
451 lat2, lon2, azi2, t, t, M12, M21, t);
458 real& lat2, real& lon2, real& azi2,
459 real& m12, real& M12, real& M21)
462 return GenDirect(lat1, lon1, azi1,
false, s12,
463 LATITUDE | LONGITUDE | AZIMUTH |
464 REDUCEDLENGTH | GEODESICSCALE,
465 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);
645 bool arcmode,
real s12_a12,
unsigned outmask,
690 real& s12, real& azi1, real& azi2, real& m12,
691 real& M12, real& M21, real& S12)
const {
692 return GenInverse(lat1, lon1, lat2, lon2,
694 REDUCEDLENGTH | GEODESICSCALE | AREA,
695 s12, azi1, azi2, m12, M12, M21, S12);
704 return GenInverse(lat1, lon1, lat2, lon2,
706 s12, t, t, t, t, t, t);
713 real& azi1, real& azi2)
const {
715 return GenInverse(lat1, lon1, lat2, lon2,
717 t, azi1, azi2, t, t, t, t);
724 real& s12, real& azi1, real& azi2)
727 return GenInverse(lat1, lon1, lat2, lon2,
729 s12, azi1, azi2, t, t, t, t);
736 real& s12, real& azi1, real& azi2, real& m12)
739 return GenInverse(lat1, lon1, lat2, lon2,
740 DISTANCE | AZIMUTH | REDUCEDLENGTH,
741 s12, azi1, azi2, m12, t, t, t);
748 real& s12, real& azi1, real& azi2,
749 real& M12, real& M21)
const {
751 return GenInverse(lat1, lon1, lat2, lon2,
752 DISTANCE | AZIMUTH | GEODESICSCALE,
753 s12, azi1, azi2, t, M12, M21, t);
760 real& s12, real& azi1, real& azi2, real& m12,
761 real& M12, real& M21)
const {
763 return GenInverse(lat1, lon1, lat2, lon2,
765 REDUCEDLENGTH | GEODESICSCALE,
766 s12, azi1, azi2, m12, M12, M21, t);
857 GeodesicLine Line(real lat1, real lon1, real azi1,
unsigned caps = ALL)
878 GeodesicLine InverseLine(real lat1, real lon1, real lat2, real lon2,
879 unsigned caps = ALL)
const;
901 GeodesicLine DirectLine(real lat1, real lon1, real azi1, real s12,
902 unsigned caps = ALL)
const;
924 GeodesicLine ArcDirectLine(real lat1, real lon1, real azi1, real a12,
925 unsigned caps = ALL)
const;
950 GeodesicLine GenDirectLine(real lat1, real lon1, real azi1,
951 bool arcmode, real s12_a12,
952 unsigned caps = ALL)
const;
975 bool Exact()
const {
return _exact; }
984 {
return 4 * Math::pi() * _c2; }
Header for GeographicLib::Constants class.
#define GEOGRAPHICLIB_EXPORT
GeographicLib::Math::real real
Header for GeographicLib::GeodesicExact class.
#define GEOGRAPHICLIB_GEODESIC_ORDER
Exact geodesic calculations.
Math::real Direct(real lat1, real lon1, real azi1, real s12, real &lat2, real &lon2, real &azi2, real &m12) const
Math::real Direct(real lat1, real lon1, real azi1, real s12, 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 &M21) 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
Math::real Flattening() const
void ArcDirect(real lat1, real lon1, real azi1, real a12, 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
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, real &azi2, real &m12, real &M12, real &M21, real &S12) const
Math::real EquatorialRadius() const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2, real &m12) const
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2, real &s12) 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 Inverse(real lat1, real lon1, real lat2, real lon2, real &s12, real &azi1, real &azi2) const
Math::real Direct(real lat1, real lon1, real azi1, real s12, 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, real &S12) const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &azi1, real &azi2) const
Math::real Inverse(real lat1, real lon1, real lat2, real lon2, real &s12) const
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2, real &s12, real &m12) const
Math::real EllipsoidArea() 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
void ArcDirect(real lat1, real lon1, real azi1, real a12, real &lat2, real &lon2, real &azi2) const
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
Namespace for GeographicLib.