10 #if !defined(GEOGRAPHICLIB_GEODESICEXACT_HPP)
11 #define GEOGRAPHICLIB_GEODESICEXACT_HPP 1
16 #if !defined(GEOGRAPHICLIB_GEODESICEXACT_ORDER)
20 # define GEOGRAPHICLIB_GEODESICEXACT_ORDER 30
23 namespace GeographicLib {
25 class GeodesicLineExact;
85 static const int nC4x_ = (nC4_ * (nC4_ + 1)) / 2;
86 static const unsigned maxit1_ = 20;
88 real tiny_, tol0_, tol1_, tol2_, tolb_, xthresh_;
102 static inline real AngRound(
real x) {
112 y = y < z ? z - (z - y) : y;
113 return x < 0 ? -y : y;
115 static inline void SinCosNorm(
real& sinx,
real& cosx) {
122 real _a, _f, _f1, _e2, _ep2, _n, _b, _c2, _etol2;
125 void Lengths(
const EllipticFunction& E,
131 bool scalep,
real& M12,
real& M21)
const;
132 real InverseStart(EllipticFunction& E,
144 real& omg12,
bool diffp,
real& dlam12)
const;
154 static Math::real inline reale(
long long hi,
long long lo) {
156 return ldexp(
real(hi), 52) + lo;
182 LATITUDE = 1U<<7 | CAP_NONE,
187 LONGITUDE = 1U<<8 | CAP_H,
194 AZIMUTH = 1U<<9 | CAP_NONE,
199 DISTANCE = 1U<<10 | CAP_E,
205 DISTANCE_IN = 1U<<11 | CAP_E,
210 REDUCEDLENGTH = 1U<<12 | CAP_D,
215 GEODESICSCALE = 1U<<13 | CAP_D,
220 AREA = 1U<<14 | CAP_C4,
225 ALL = OUT_ALL| CAP_ALL,
284 real& lat2, real& lon2, real& azi2,
285 real& m12, real& M12, real& M21, real& S12)
288 return GenDirect(lat1, lon1, azi1,
false, s12,
289 LATITUDE | LONGITUDE | AZIMUTH |
290 REDUCEDLENGTH | GEODESICSCALE | AREA,
291 lat2, lon2, azi2, t, m12, M12, M21, S12);
298 real& lat2, real& lon2)
301 return GenDirect(lat1, lon1, azi1,
false, s12,
302 LATITUDE | LONGITUDE,
303 lat2, lon2, t, t, t, t, t, t);
310 real& lat2, real& lon2, real& azi2)
313 return GenDirect(lat1, lon1, azi1,
false, s12,
314 LATITUDE | LONGITUDE | AZIMUTH,
315 lat2, lon2, azi2, t, t, t, t, t);
322 real& lat2, real& lon2, real& azi2, real& m12)
325 return GenDirect(lat1, lon1, azi1,
false, s12,
326 LATITUDE | LONGITUDE | AZIMUTH | REDUCEDLENGTH,
327 lat2, lon2, azi2, t, m12, t, t, t);
334 real& lat2, real& lon2, real& azi2,
335 real& M12, real& M21)
338 return GenDirect(lat1, lon1, azi1,
false, s12,
339 LATITUDE | LONGITUDE | AZIMUTH | GEODESICSCALE,
340 lat2, lon2, azi2, t, t, M12, M21, t);
347 real& lat2, real& lon2, real& azi2,
348 real& m12, real& M12, real& M21)
351 return GenDirect(lat1, lon1, azi1,
false, s12,
352 LATITUDE | LONGITUDE | AZIMUTH |
353 REDUCEDLENGTH | GEODESICSCALE,
354 lat2, lon2, azi2, t, m12, M12, M21, t);
396 void ArcDirect(real lat1, real lon1, real azi1, real a12,
397 real& lat2, real& lon2, real& azi2, real& s12,
398 real& m12, real& M12, real& M21, real& S12)
400 GenDirect(lat1, lon1, azi1,
true, a12,
401 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
402 REDUCEDLENGTH | GEODESICSCALE | AREA,
403 lat2, lon2, azi2, s12, m12, M12, M21, S12);
409 void ArcDirect(real lat1, real lon1, real azi1, real a12,
410 real& lat2, real& lon2)
const {
412 GenDirect(lat1, lon1, azi1,
true, a12,
413 LATITUDE | LONGITUDE,
414 lat2, lon2, t, t, t, t, t, t);
420 void ArcDirect(real lat1, real lon1, real azi1, real a12,
421 real& lat2, real& lon2, real& azi2)
const {
423 GenDirect(lat1, lon1, azi1,
true, a12,
424 LATITUDE | LONGITUDE | AZIMUTH,
425 lat2, lon2, azi2, t, t, t, t, t);
431 void ArcDirect(real lat1, real lon1, real azi1, real a12,
432 real& lat2, real& lon2, real& azi2, real& s12)
435 GenDirect(lat1, lon1, azi1,
true, a12,
436 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE,
437 lat2, lon2, azi2, s12, t, t, t, t);
443 void ArcDirect(real lat1, real lon1, real azi1, real a12,
444 real& lat2, real& lon2, real& azi2,
445 real& s12, real& m12)
const {
447 GenDirect(lat1, lon1, azi1,
true, a12,
448 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
450 lat2, lon2, azi2, s12, m12, t, t, t);
456 void ArcDirect(real lat1, real lon1, real azi1, real a12,
457 real& lat2, real& lon2, real& azi2, real& s12,
458 real& M12, real& M21)
const {
460 GenDirect(lat1, lon1, azi1,
true, a12,
461 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
463 lat2, lon2, azi2, s12, t, M12, M21, t);
469 void ArcDirect(real lat1, real lon1, real azi1, real a12,
470 real& lat2, real& lon2, real& azi2, real& s12,
471 real& m12, real& M12, real& M21)
const {
473 GenDirect(lat1, lon1, azi1,
true, a12,
474 LATITUDE | LONGITUDE | AZIMUTH | DISTANCE |
475 REDUCEDLENGTH | GEODESICSCALE,
476 lat2, lon2, azi2, s12, m12, M12, M21, t);
529 bool arcmode,
real s12_a12,
unsigned outmask,
569 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
570 real& s12, real& azi1, real& azi2, real& m12,
571 real& M12, real& M21, real& S12)
const {
572 return GenInverse(lat1, lon1, lat2, lon2,
574 REDUCEDLENGTH | GEODESICSCALE | AREA,
575 s12, azi1, azi2, m12, M12, M21, S12);
581 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
584 return GenInverse(lat1, lon1, lat2, lon2,
586 s12, t, t, t, t, t, t);
592 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
593 real& azi1, real& azi2)
const {
595 return GenInverse(lat1, lon1, lat2, lon2,
597 t, azi1, azi2, t, t, t, t);
603 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
604 real& s12, real& azi1, real& azi2)
607 return GenInverse(lat1, lon1, lat2, lon2,
609 s12, azi1, azi2, t, t, t, t);
615 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
616 real& s12, real& azi1, real& azi2, real& m12)
619 return GenInverse(lat1, lon1, lat2, lon2,
620 DISTANCE | AZIMUTH | REDUCEDLENGTH,
621 s12, azi1, azi2, m12, t, t, t);
627 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
628 real& s12, real& azi1, real& azi2,
629 real& M12, real& M21)
const {
631 return GenInverse(lat1, lon1, lat2, lon2,
632 DISTANCE | AZIMUTH | GEODESICSCALE,
633 s12, azi1, azi2, t, M12, M21, t);
639 Math::real Inverse(real lat1, real lon1, real lat2, real lon2,
640 real& s12, real& azi1, real& azi2, real& m12,
641 real& M12, real& M21)
const {
643 return GenInverse(lat1, lon1, lat2, lon2,
645 REDUCEDLENGTH | GEODESICSCALE,
646 s12, azi1, azi2, m12, M12, M21, t);
761 Math::real InverseFlattening()
const {
return 1/_f; }
784 #endif // GEOGRAPHICLIB_GEODESICEXACT_HPP