35 # pragma warning (disable: 4701 4127)
43 : maxit2_(maxit1_ +
Math::digits() + 10)
47 , tiny_(sqrt(numeric_limits<real>::min()))
48 , tol0_(numeric_limits<real>::epsilon())
55 , tolb_(tol0_ * tol2_)
56 , xthresh_(1000 * tol2_)
58 , _f(f <= 1 ? f : 1/f)
61 , _ep2(_e2 /
Math::sq(_f1))
66 (_e2 > 0 ?
Math::atanh(sqrt(_e2)) : atan(sqrt(-_e2))) /
78 , _etol2(0.1 * tol2_ /
79 sqrt( max(real(0.001), abs(_f)) * min(real(1), 1 - _f/2) / 2 ))
97 const real c[],
int n) {
105 ar = 2 * (cosx - sinx) * (cosx + sinx),
106 y0 = n & 1 ? *--c : 0, y1 = 0;
111 y1 = ar * y0 - y1 + *--c;
112 y0 = ar * y1 - y0 + *--c;
115 ? 2 * sinx * cosx * y0
125 bool arcmode, real s12_a12,
unsigned outmask,
126 real& lat2, real& lon2, real& azi2,
127 real& s12, real& m12, real& M12, real& M21,
133 GenPosition(arcmode, s12_a12, outmask,
134 lat2, lon2, azi2, s12, m12, M12, M21, S12);
139 real& s12, real& azi1, real& azi2,
140 real& m12, real& M12, real& M21, real& S12)
149 lon12 = AngRound(lon12);
151 int lonsign = lon12 >= 0 ? 1 : -1;
154 lat1 = AngRound(lat1);
155 lat2 = AngRound(lat2);
157 int swapp = abs(lat1) >= abs(lat2) ? 1 : -1;
163 int latsign = lat1 < 0 ? 1 : -1;
178 real phi, sbet1, cbet1, sbet2, cbet2, s12x, m12x;
182 sbet1 = _f1 * sin(phi);
183 cbet1 = lat1 == -90 ? tiny_ : cos(phi);
184 SinCosNorm(sbet1, cbet1);
188 sbet2 = _f1 * sin(phi);
189 cbet2 = abs(lat2) == 90 ? tiny_ : cos(phi);
190 SinCosNorm(sbet2, cbet2);
200 if (cbet1 < -sbet1) {
202 sbet2 = sbet2 < 0 ? sbet1 : -sbet1;
204 if (abs(sbet2) == -sbet1)
209 dn1 = sqrt(1 + _ep2 *
Math::sq(sbet1)),
210 dn2 = sqrt(1 + _ep2 *
Math::sq(sbet2));
214 slam12 = abs(lon12) == 180 ? 0 : sin(lam12),
218 real a12, sig12, calp1, salp1, calp2 = 0, salp2 = 0;
220 real C1a[nC1_ + 1], C2a[nC2_ + 1], C3a[nC3_];
222 bool meridian = lat1 == -90 || slam12 == 0;
229 calp1 = clam12; salp1 = slam12;
230 calp2 = 1; salp2 = 0;
234 ssig1 = sbet1, csig1 = calp1 * cbet1,
235 ssig2 = sbet2, csig2 = calp2 * cbet2;
238 sig12 = atan2(max(csig1 * ssig2 - ssig1 * csig2, real(0)),
239 csig1 * csig2 + ssig1 * ssig2);
242 Lengths(_n, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
243 cbet1, cbet2, s12x, m12x, dummy,
253 if (sig12 < 1 || m12x >= 0) {
269 calp1 = calp2 = 0; salp1 = salp2 = 1;
271 sig12 = omg12 = lam12 / _f1;
272 m12x = _b * sin(sig12);
274 M12 = M21 = cos(sig12);
277 }
else if (!meridian) {
284 sig12 = InverseStart(sbet1, cbet1, dn1, sbet2, cbet2, dn2,
286 salp1, calp1, salp2, calp2, dnm,
291 s12x = sig12 * _b * dnm;
292 m12x =
Math::sq(dnm) * _b * sin(sig12 / dnm);
294 M12 = M21 = cos(sig12 / dnm);
296 omg12 = lam12 / (_f1 * dnm);
312 real ssig1 = 0, csig1 = 0, ssig2 = 0, csig2 = 0, eps = 0;
315 real salp1a = tiny_, calp1a = 1, salp1b = tiny_, calp1b = -1;
316 for (
bool tripn =
false, tripb =
false;
322 real v = Lambda12(sbet1, cbet1, dn1, sbet2, cbet2, dn2, salp1, calp1,
323 salp2, calp2, sig12, ssig1, csig1, ssig2, csig2,
324 eps, omg12, numit < maxit1_, dv, C1a, C2a, C3a)
328 if (tripb || !(abs(v) >= (tripn ? 8 : 2) * tol0_))
break;
330 if (v > 0 && (numit > maxit1_ || calp1/salp1 > calp1b/salp1b))
331 { salp1b = salp1; calp1b = calp1; }
332 else if (v < 0 && (numit > maxit1_ || calp1/salp1 < calp1a/salp1a))
333 { salp1a = salp1; calp1a = calp1; }
334 if (numit < maxit1_ && dv > 0) {
338 sdalp1 = sin(dalp1), cdalp1 = cos(dalp1),
339 nsalp1 = salp1 * cdalp1 + calp1 * sdalp1;
340 if (nsalp1 > 0 && abs(dalp1) <
Math::pi()) {
341 calp1 = calp1 * cdalp1 - salp1 * sdalp1;
343 SinCosNorm(salp1, calp1);
347 tripn = abs(v) <= 16 * tol0_;
359 salp1 = (salp1a + salp1b)/2;
360 calp1 = (calp1a + calp1b)/2;
361 SinCosNorm(salp1, calp1);
363 tripb = (abs(salp1a - salp1) + (calp1a - calp1) < tolb_ ||
364 abs(salp1 - salp1b) + (calp1 - calp1b) < tolb_);
368 Lengths(eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
369 cbet1, cbet2, s12x, m12x, dummy,
375 omg12 = lam12 - omg12;
385 if (outmask &
AREA) {
388 salp0 = salp1 * cbet1,
391 if (calp0 != 0 && salp0 != 0) {
394 ssig1 = sbet1, csig1 = calp1 * cbet1,
395 ssig2 = sbet2, csig2 = calp2 * cbet2,
397 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2),
399 A4 =
Math::sq(_a) * calp0 * salp0 * _e2;
400 SinCosNorm(ssig1, csig1);
401 SinCosNorm(ssig2, csig2);
405 B41 = SinCosSeries(
false, ssig1, csig1, C4a, nC4_),
406 B42 = SinCosSeries(
false, ssig2, csig2, C4a, nC4_);
407 S12 = A4 * (B42 - B41);
414 sbet2 - sbet1 < real(1.75)) {
419 somg12 = sin(omg12), domg12 = 1 + cos(omg12),
420 dbet1 = 1 + cbet1, dbet2 = 1 + cbet2;
421 alp12 = 2 * atan2( somg12 * ( sbet1 * dbet2 + sbet2 * dbet1 ),
422 domg12 * ( sbet1 * sbet2 + dbet1 * dbet2 ) );
426 salp12 = salp2 * calp1 - calp2 * salp1,
427 calp12 = calp2 * calp1 + salp2 * salp1;
432 if (salp12 == 0 && calp12 < 0) {
433 salp12 = tiny_ * calp1;
436 alp12 = atan2(salp12, calp12);
439 S12 *= swapp * lonsign * latsign;
452 salp1 *= swapp * lonsign; calp1 *= swapp * latsign;
453 salp2 *= swapp * lonsign; calp2 *= swapp * latsign;
465 void Geodesic::Lengths(
real eps,
real sig12,
479 AB1 = (1 + A1m1) * (SinCosSeries(
true, ssig2, csig2, C1a, nC1_) -
480 SinCosSeries(
true, ssig1, csig1, C1a, nC1_)),
482 AB2 = (1 + A2m1) * (SinCosSeries(
true, ssig2, csig2, C2a, nC2_) -
483 SinCosSeries(
true, ssig1, csig1, C2a, nC2_));
485 real J12 = m0 * sig12 + (AB1 - AB2);
489 m12b = dn2 * (csig1 * ssig2) - dn1 * (ssig1 * csig2) - csig1 * csig2 * J12;
491 s12b = (1 + A1m1) * sig12 + AB1;
493 real csig12 = csig1 * csig2 + ssig1 * ssig2;
494 real t = _ep2 * (cbet1 - cbet2) * (cbet1 + cbet2) / (dn1 + dn2);
495 M12 = csig12 + (t * ssig2 - csig2 * J12) * ssig1 / dn1;
496 M21 = csig12 - (t * ssig1 - csig1 * J12) * ssig2 / dn2;
508 if ( !(q == 0 && r <= 0) ) {
517 disc = S * (S + 2 * r3);
524 T3 += T3 < 0 ? -sqrt(disc) : sqrt(disc);
528 u += T + (T ? r2 / T : 0);
531 real ang = atan2(sqrt(-disc), -(S + r3));
534 u += 2 * r * cos(ang / 3);
539 uv = u < 0 ? q / (v - u) : u + v,
540 w = (uv - q) / (2 * v);
543 k = uv / (sqrt(uv +
Math::sq(w)) + w);
568 sbet12 = sbet2 * cbet1 - cbet2 * sbet1,
569 cbet12 = cbet2 * cbet1 + sbet2 * sbet1;
570 #if defined(__GNUC__) && __GNUC__ == 4 && \
571 (__GNUC_MINOR__ < 6 || defined(__MINGW32__))
585 real sbet12a = sbet2 * cbet1 + cbet2 * sbet1;
587 bool shortline = cbet12 >= 0 && sbet12 <
real(0.5) &&
588 cbet2 * lam12 <
real(0.5);
594 sbetm2 /= sbetm2 +
Math::sq(cbet1 + cbet2);
595 dnm = sqrt(1 + _ep2 * sbetm2);
598 real somg12 = sin(omg12), comg12 = cos(omg12);
600 salp1 = cbet2 * somg12;
601 calp1 = comg12 >= 0 ?
602 sbet12 + cbet2 * sbet1 *
Math::sq(somg12) / (1 + comg12) :
603 sbet12a - cbet2 * sbet1 *
Math::sq(somg12) / (1 - comg12);
607 csig12 = sbet1 * sbet2 + cbet1 * cbet2 * comg12;
609 if (shortline && ssig12 < _etol2) {
611 salp2 = cbet1 * somg12;
612 calp2 = sbet12 - cbet1 * sbet2 *
613 (comg12 >= 0 ?
Math::sq(somg12) / (1 + comg12) : 1 - comg12);
614 SinCosNorm(salp2, calp2);
616 sig12 = atan2(ssig12, csig12);
617 }
else if (abs(_n) >
real(0.1) ||
624 real y, lamscale, betscale;
634 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2);
635 lamscale = _f * cbet1 * A3f(eps) *
Math::pi();
637 betscale = lamscale * cbet1;
639 x = (lam12 -
Math::pi()) / lamscale;
640 y = sbet12a / betscale;
644 cbet12a = cbet2 * cbet1 - sbet2 * sbet1,
645 bet12a = atan2(sbet12a, cbet12a);
646 real m12b, m0, dummy;
650 sbet1, -cbet1, dn1, sbet2, cbet2, dn2,
651 cbet1, cbet2, dummy, m12b, m0,
false,
652 dummy, dummy, C1a, C2a);
653 x = -1 + m12b / (cbet1 * cbet2 * m0 *
Math::pi());
654 betscale = x < -
real(0.01) ? sbet12a / x :
656 lamscale = betscale / cbet1;
657 y = (lam12 -
Math::pi()) / lamscale;
660 if (y > -tol1_ && x > -1 - xthresh_) {
666 calp1 = max(
real(x > -tol1_ ? 0 : -1),
real(x));
704 real k = Astroid(x, y);
706 omg12a = lamscale * ( _f >= 0 ? -x * k/(1 + k) : -y * (1 + k)/k );
707 somg12 = sin(omg12a); comg12 = -cos(omg12a);
709 salp1 = cbet2 * somg12;
710 calp1 = sbet12a - cbet2 * sbet1 *
Math::sq(somg12) / (1 - comg12);
715 SinCosNorm(salp1, calp1);
717 salp1 = 1; calp1 = 0;
730 bool diffp,
real& dlam12,
734 if (sbet1 == 0 && calp1 == 0)
741 salp0 = salp1 * cbet1,
744 real somg1, comg1, somg2, comg2, omg12, lam12;
747 ssig1 = sbet1; somg1 = salp0 * sbet1;
748 csig1 = comg1 = calp1 * cbet1;
749 SinCosNorm(ssig1, csig1);
756 salp2 = cbet2 != cbet1 ? salp0 / cbet2 : salp1;
761 calp2 = cbet2 != cbet1 || abs(sbet2) != -sbet1 ?
764 (cbet2 - cbet1) * (cbet1 + cbet2) :
765 (sbet1 - sbet2) * (sbet1 + sbet2))) / cbet2 :
769 ssig2 = sbet2; somg2 = salp0 * sbet2;
770 csig2 = comg2 = calp2 * cbet2;
771 SinCosNorm(ssig2, csig2);
775 sig12 = atan2(max(csig1 * ssig2 - ssig1 * csig2,
real(0)),
776 csig1 * csig2 + ssig1 * ssig2);
779 omg12 = atan2(max(comg1 * somg2 - somg1 * comg2,
real(0)),
780 comg1 * comg2 + somg1 * somg2);
783 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2);
785 B312 = (SinCosSeries(
true, ssig2, csig2, C3a, nC3_-1) -
786 SinCosSeries(
true, ssig1, csig1, C3a, nC3_-1));
788 domg12 = salp0 * h0 * (sig12 + B312);
789 lam12 = omg12 + domg12;
793 dlam12 = - 2 * _f1 * dn1 / sbet1;
796 Lengths(eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
797 cbet1, cbet2, dummy, dlam12, dummy,
798 false, dummy, dummy, C1a, C2a);
799 dlam12 *= _f1 / (calp2 * cbet2);
809 for (
int i = nA3x_; i > 0; )
810 v = eps * v + _A3x[--i];
814 void Geodesic::C3f(
real eps,
real c[])
const {
817 for (
int j = nC3x_, k = nC3_ - 1; k > 0; ) {
819 for (
int i = nC3_ - k; i > 0; --i) {
820 t = eps * t + _C3x[--j];
826 for (
int k = 1; k < nC3_; ) {
832 void Geodesic::C4f(
real eps,
real c[])
const {
835 for (
int j = nC4x_, k = nC4_; k > 0; ) {
837 for (
int i = nC4_ - k + 1; i > 0; --i)
838 t = eps * t + _C4x[--j];
843 for (
int k = 1; k < nC4_; ) {
864 t = eps2*(eps2+16)/64;
867 t = eps2*(eps2*(eps2+4)+64)/256;
870 t = eps2*(eps2*(eps2*(25*eps2+64)+256)+4096)/16384;
873 GEOGRAPHICLIB_STATIC_ASSERT(nA1_ >= 0 && nA1_ <= 8,
"Bad value of nA1_");
876 return (t + eps) / (1 - eps);
880 void Geodesic::C1f(
real eps,
real c[]) {
896 c[1] = d*(3*eps2-8)/16;
903 c[1] = d*(3*eps2-8)/16;
905 c[2] = d*(eps2-2)/32;
912 c[1] = d*((6-eps2)*eps2-16)/32;
914 c[2] = d*(eps2-2)/32;
916 c[3] = d*(9*eps2-16)/768;
923 c[1] = d*((6-eps2)*eps2-16)/32;
925 c[2] = d*((64-9*eps2)*eps2-128)/2048;
927 c[3] = d*(9*eps2-16)/768;
929 c[4] = d*(3*eps2-5)/512;
936 c[1] = d*(eps2*(eps2*(19*eps2-64)+384)-1024)/2048;
938 c[2] = d*((64-9*eps2)*eps2-128)/2048;
940 c[3] = d*((72-9*eps2)*eps2-128)/6144;
942 c[4] = d*(3*eps2-5)/512;
944 c[5] = d*(35*eps2-56)/10240;
951 c[1] = d*(eps2*(eps2*(19*eps2-64)+384)-1024)/2048;
953 c[2] = d*(eps2*(eps2*(7*eps2-18)+128)-256)/4096;
955 c[3] = d*((72-9*eps2)*eps2-128)/6144;
957 c[4] = d*((96-11*eps2)*eps2-160)/16384;
959 c[5] = d*(35*eps2-56)/10240;
961 c[6] = d*(9*eps2-14)/4096;
965 c[8] = -429*d/262144;
968 GEOGRAPHICLIB_STATIC_ASSERT(nC1_ >= 0 && nC1_ <= 8,
"Bad value of nC1_");
973 void Geodesic::C1pf(
real eps,
real c[]) {
989 c[1] = d*(16-9*eps2)/32;
996 c[1] = d*(16-9*eps2)/32;
998 c[2] = d*(30-37*eps2)/96;
1005 c[1] = d*(eps2*(205*eps2-432)+768)/1536;
1007 c[2] = d*(30-37*eps2)/96;
1009 c[3] = d*(116-225*eps2)/384;
1016 c[1] = d*(eps2*(205*eps2-432)+768)/1536;
1018 c[2] = d*(eps2*(4005*eps2-4736)+3840)/12288;
1020 c[3] = d*(116-225*eps2)/384;
1022 c[4] = d*(2695-7173*eps2)/7680;
1026 c[6] = 38081*d/61440;
1029 c[1] = d*(eps2*((9840-4879*eps2)*eps2-20736)+36864)/73728;
1031 c[2] = d*(eps2*(4005*eps2-4736)+3840)/12288;
1033 c[3] = d*(eps2*(8703*eps2-7200)+3712)/12288;
1035 c[4] = d*(2695-7173*eps2)/7680;
1037 c[5] = d*(41604-141115*eps2)/92160;
1039 c[6] = 38081*d/61440;
1041 c[7] = 459485*d/516096;
1044 c[1] = d*(eps2*((9840-4879*eps2)*eps2-20736)+36864)/73728;
1046 c[2] = d*(eps2*((120150-86171*eps2)*eps2-142080)+115200)/368640;
1048 c[3] = d*(eps2*(8703*eps2-7200)+3712)/12288;
1050 c[4] = d*(eps2*(1082857*eps2-688608)+258720)/737280;
1052 c[5] = d*(41604-141115*eps2)/92160;
1054 c[6] = d*(533134-2200311*eps2)/860160;
1056 c[7] = 459485*d/516096;
1058 c[8] = 109167851*d/82575360;
1061 GEOGRAPHICLIB_STATIC_ASSERT(nC1p_ >= 0 && nC1p_ <= 8,
1062 "Bad value of nC1p_");
1079 t = eps2*(9*eps2+16)/64;
1082 t = eps2*(eps2*(25*eps2+36)+64)/256;
1085 t = eps2*(eps2*(eps2*(1225*eps2+1600)+2304)+4096)/16384;
1088 GEOGRAPHICLIB_STATIC_ASSERT(nA2_ >= 0 && nA2_ <= 8,
"Bad value of nA2_");
1091 return t * (1 - eps) - eps;
1095 void Geodesic::C2f(
real eps,
real c[]) {
1111 c[1] = d*(eps2+8)/16;
1118 c[1] = d*(eps2+8)/16;
1120 c[2] = d*(eps2+6)/32;
1127 c[1] = d*(eps2*(eps2+2)+16)/32;
1129 c[2] = d*(eps2+6)/32;
1131 c[3] = d*(15*eps2+80)/768;
1138 c[1] = d*(eps2*(eps2+2)+16)/32;
1140 c[2] = d*(eps2*(35*eps2+64)+384)/2048;
1142 c[3] = d*(15*eps2+80)/768;
1144 c[4] = d*(7*eps2+35)/512;
1151 c[1] = d*(eps2*(eps2*(41*eps2+64)+128)+1024)/2048;
1153 c[2] = d*(eps2*(35*eps2+64)+384)/2048;
1155 c[3] = d*(eps2*(69*eps2+120)+640)/6144;
1157 c[4] = d*(7*eps2+35)/512;
1159 c[5] = d*(105*eps2+504)/10240;
1166 c[1] = d*(eps2*(eps2*(41*eps2+64)+128)+1024)/2048;
1168 c[2] = d*(eps2*(eps2*(47*eps2+70)+128)+768)/4096;
1170 c[3] = d*(eps2*(69*eps2+120)+640)/6144;
1172 c[4] = d*(eps2*(133*eps2+224)+1120)/16384;
1174 c[5] = d*(105*eps2+504)/10240;
1176 c[6] = d*(33*eps2+154)/4096;
1180 c[8] = 6435*d/262144;
1183 GEOGRAPHICLIB_STATIC_ASSERT(nC2_ >= 0 && nC2_ <= 8,
"Bad value of nC2_");
1188 void Geodesic::A3coeff() {
1197 _A3x[1] = -1/
real(2);
1202 _A3x[2] = -1/
real(4);
1207 _A3x[2] = (-_n-2)/8;
1208 _A3x[3] = -1/
real(16);
1213 _A3x[2] = (_n*(3*_n-1)-2)/8;
1214 _A3x[3] = (-3*_n-1)/16;
1215 _A3x[4] = -3/
real(64);
1220 _A3x[2] = (_n*(3*_n-1)-2)/8;
1221 _A3x[3] = ((-_n-3)*_n-1)/16;
1222 _A3x[4] = (-2*_n-3)/64;
1223 _A3x[5] = -3/
real(128);
1228 _A3x[2] = (_n*(3*_n-1)-2)/8;
1229 _A3x[3] = (_n*(_n*(5*_n-1)-3)-1)/16;
1230 _A3x[4] = ((-10*_n-2)*_n-3)/64;
1231 _A3x[5] = (-5*_n-3)/128;
1232 _A3x[6] = -5/
real(256);
1237 _A3x[2] = (_n*(3*_n-1)-2)/8;
1238 _A3x[3] = (_n*(_n*(5*_n-1)-3)-1)/16;
1239 _A3x[4] = (_n*((-5*_n-20)*_n-4)-6)/128;
1240 _A3x[5] = ((-5*_n-10)*_n-6)/256;
1241 _A3x[6] = (-15*_n-20)/1024;
1242 _A3x[7] = -25/
real(2048);
1245 GEOGRAPHICLIB_STATIC_ASSERT(nA3_ >= 0 && nA3_ <= 8,
"Bad value of nA3_");
1250 void Geodesic::C3coeff() {
1257 _C3x[0] = 1/
real(4);
1261 _C3x[1] = 1/
real(8);
1262 _C3x[2] = 1/
real(16);
1266 _C3x[1] = 1/
real(8);
1267 _C3x[2] = 3/
real(64);
1268 _C3x[3] = (2-3*_n)/32;
1269 _C3x[4] = 3/
real(64);
1270 _C3x[5] = 5/
real(192);
1274 _C3x[1] = (1-_n*_n)/8;
1275 _C3x[2] = (3*_n+3)/64;
1276 _C3x[3] = 5/
real(128);
1277 _C3x[4] = ((_n-3)*_n+2)/32;
1278 _C3x[5] = (3-2*_n)/64;
1279 _C3x[6] = 3/
real(128);
1280 _C3x[7] = (5-9*_n)/192;
1281 _C3x[8] = 3/
real(128);
1282 _C3x[9] = 7/
real(512);
1286 _C3x[1] = (1-_n*_n)/8;
1287 _C3x[2] = ((3-_n)*_n+3)/64;
1288 _C3x[3] = (2*_n+5)/128;
1289 _C3x[4] = 3/
real(128);
1290 _C3x[5] = ((_n-3)*_n+2)/32;
1291 _C3x[6] = ((-3*_n-2)*_n+3)/64;
1292 _C3x[7] = (_n+3)/128;
1293 _C3x[8] = 5/
real(256);
1294 _C3x[9] = (_n*(5*_n-9)+5)/192;
1295 _C3x[10] = (9-10*_n)/384;
1296 _C3x[11] = 7/
real(512);
1297 _C3x[12] = (7-14*_n)/512;
1298 _C3x[13] = 7/
real(512);
1299 _C3x[14] = 21/
real(2560);
1303 _C3x[1] = (1-_n*_n)/8;
1304 _C3x[2] = (_n*((-5*_n-1)*_n+3)+3)/64;
1305 _C3x[3] = (_n*(2*_n+2)+5)/128;
1306 _C3x[4] = (11*_n+12)/512;
1307 _C3x[5] = 21/
real(1024);
1308 _C3x[6] = ((_n-3)*_n+2)/32;
1309 _C3x[7] = (_n*(_n*(2*_n-3)-2)+3)/64;
1310 _C3x[8] = ((2-9*_n)*_n+6)/256;
1311 _C3x[9] = (_n+5)/256;
1312 _C3x[10] = 27/
real(2048);
1313 _C3x[11] = (_n*((5-_n)*_n-9)+5)/192;
1314 _C3x[12] = ((-6*_n-10)*_n+9)/384;
1315 _C3x[13] = (21-4*_n)/1536;
1316 _C3x[14] = 3/
real(256);
1317 _C3x[15] = (_n*(10*_n-14)+7)/512;
1318 _C3x[16] = (7-10*_n)/512;
1319 _C3x[17] = 9/
real(1024);
1320 _C3x[18] = (21-45*_n)/2560;
1321 _C3x[19] = 9/
real(1024);
1322 _C3x[20] = 11/
real(2048);
1326 _C3x[1] = (1-_n*_n)/8;
1327 _C3x[2] = (_n*((-5*_n-1)*_n+3)+3)/64;
1328 _C3x[3] = (_n*((2-2*_n)*_n+2)+5)/128;
1329 _C3x[4] = (_n*(3*_n+11)+12)/512;
1330 _C3x[5] = (10*_n+21)/1024;
1331 _C3x[6] = 243/
real(16384);
1332 _C3x[7] = ((_n-3)*_n+2)/32;
1333 _C3x[8] = (_n*(_n*(2*_n-3)-2)+3)/64;
1334 _C3x[9] = (_n*((-6*_n-9)*_n+2)+6)/256;
1335 _C3x[10] = ((1-2*_n)*_n+5)/256;
1336 _C3x[11] = (69*_n+108)/8192;
1337 _C3x[12] = 187/
real(16384);
1338 _C3x[13] = (_n*((5-_n)*_n-9)+5)/192;
1339 _C3x[14] = (_n*(_n*(10*_n-6)-10)+9)/384;
1340 _C3x[15] = ((-77*_n-8)*_n+42)/3072;
1341 _C3x[16] = (12-_n)/1024;
1342 _C3x[17] = 139/
real(16384);
1343 _C3x[18] = (_n*((20-7*_n)*_n-28)+14)/1024;
1344 _C3x[19] = ((-7*_n-40)*_n+28)/2048;
1345 _C3x[20] = (72-43*_n)/8192;
1346 _C3x[21] = 127/
real(16384);
1347 _C3x[22] = (_n*(75*_n-90)+42)/5120;
1348 _C3x[23] = (9-15*_n)/1024;
1349 _C3x[24] = 99/
real(16384);
1350 _C3x[25] = (44-99*_n)/8192;
1351 _C3x[26] = 99/
real(16384);
1352 _C3x[27] = 429/
real(114688);
1355 GEOGRAPHICLIB_STATIC_ASSERT(nC3_ >= 0 && nC3_ <= 8,
"Bad value of nC3_");
1362 void Geodesic::C4coeff() {
1367 _C4x[0] = 2/
real(3);
1370 _C4x[0] = (10-4*_n)/15;
1371 _C4x[1] = -1/
real(5);
1372 _C4x[2] = 1/
real(45);
1375 _C4x[0] = (_n*(8*_n-28)+70)/105;
1376 _C4x[1] = (16*_n-7)/35;
1377 _C4x[2] = -2/
real(105);
1378 _C4x[3] = (7-16*_n)/315;
1379 _C4x[4] = -2/
real(105);
1380 _C4x[5] = 4/
real(525);
1383 _C4x[0] = (_n*(_n*(4*_n+24)-84)+210)/315;
1384 _C4x[1] = ((48-32*_n)*_n-21)/105;
1385 _C4x[2] = (-32*_n-6)/315;
1386 _C4x[3] = 11/
real(315);
1387 _C4x[4] = (_n*(32*_n-48)+21)/945;
1388 _C4x[5] = (64*_n-18)/945;
1389 _C4x[6] = -1/
real(105);
1390 _C4x[7] = (12-32*_n)/1575;
1391 _C4x[8] = -8/
real(1575);
1392 _C4x[9] = 8/
real(2205);
1395 _C4x[0] = (_n*(_n*(_n*(16*_n+44)+264)-924)+2310)/3465;
1396 _C4x[1] = (_n*(_n*(48*_n-352)+528)-231)/1155;
1397 _C4x[2] = (_n*(1088*_n-352)-66)/3465;
1398 _C4x[3] = (121-368*_n)/3465;
1399 _C4x[4] = 4/
real(1155);
1400 _C4x[5] = (_n*((352-48*_n)*_n-528)+231)/10395;
1401 _C4x[6] = ((704-896*_n)*_n-198)/10395;
1402 _C4x[7] = (80*_n-99)/10395;
1403 _C4x[8] = 4/
real(1155);
1404 _C4x[9] = (_n*(320*_n-352)+132)/17325;
1405 _C4x[10] = (384*_n-88)/17325;
1406 _C4x[11] = -8/
real(1925);
1407 _C4x[12] = (88-256*_n)/24255;
1408 _C4x[13] = -16/
real(8085);
1409 _C4x[14] = 64/
real(31185);
1412 _C4x[0] = (_n*(_n*(_n*(_n*(100*_n+208)+572)+3432)-12012)+30030)/45045;
1413 _C4x[1] = (_n*(_n*(_n*(64*_n+624)-4576)+6864)-3003)/15015;
1414 _C4x[2] = (_n*((14144-10656*_n)*_n-4576)-858)/45045;
1415 _C4x[3] = ((-224*_n-4784)*_n+1573)/45045;
1416 _C4x[4] = (1088*_n+156)/45045;
1417 _C4x[5] = 97/
real(15015);
1418 _C4x[6] = (_n*(_n*((-64*_n-624)*_n+4576)-6864)+3003)/135135;
1419 _C4x[7] = (_n*(_n*(5952*_n-11648)+9152)-2574)/135135;
1420 _C4x[8] = (_n*(5792*_n+1040)-1287)/135135;
1421 _C4x[9] = (468-2944*_n)/135135;
1422 _C4x[10] = 1/
real(9009);
1423 _C4x[11] = (_n*((4160-1440*_n)*_n-4576)+1716)/225225;
1424 _C4x[12] = ((4992-8448*_n)*_n-1144)/225225;
1425 _C4x[13] = (1856*_n-936)/225225;
1426 _C4x[14] = 8/
real(10725);
1427 _C4x[15] = (_n*(3584*_n-3328)+1144)/315315;
1428 _C4x[16] = (1024*_n-208)/105105;
1429 _C4x[17] = -136/
real(63063);
1430 _C4x[18] = (832-2560*_n)/405405;
1431 _C4x[19] = -128/
real(135135);
1432 _C4x[20] = 128/
real(99099);
1435 _C4x[0] = (_n*(_n*(_n*(_n*(_n*(56*_n+100)+208)+572)+3432)-12012)+30030)/
1437 _C4x[1] = (_n*(_n*(_n*(_n*(16*_n+64)+624)-4576)+6864)-3003)/15015;
1438 _C4x[2] = (_n*(_n*(_n*(1664*_n-10656)+14144)-4576)-858)/45045;
1439 _C4x[3] = (_n*(_n*(10736*_n-224)-4784)+1573)/45045;
1440 _C4x[4] = ((1088-4480*_n)*_n+156)/45045;
1441 _C4x[5] = (291-464*_n)/45045;
1442 _C4x[6] = 10/
real(9009);
1443 _C4x[7] = (_n*(_n*(_n*((-16*_n-64)*_n-624)+4576)-6864)+3003)/135135;
1444 _C4x[8] = (_n*(_n*((5952-768*_n)*_n-11648)+9152)-2574)/135135;
1445 _C4x[9] = (_n*((5792-10704*_n)*_n+1040)-1287)/135135;
1446 _C4x[10] = (_n*(3840*_n-2944)+468)/135135;
1447 _C4x[11] = (112*_n+15)/135135;
1448 _C4x[12] = 10/
real(9009);
1449 _C4x[13] = (_n*(_n*(_n*(128*_n-1440)+4160)-4576)+1716)/225225;
1450 _C4x[14] = (_n*(_n*(6784*_n-8448)+4992)-1144)/225225;
1451 _C4x[15] = (_n*(1664*_n+1856)-936)/225225;
1452 _C4x[16] = (168-1664*_n)/225225;
1453 _C4x[17] = -4/
real(25025);
1454 _C4x[18] = (_n*((3584-1792*_n)*_n-3328)+1144)/315315;
1455 _C4x[19] = ((1024-2048*_n)*_n-208)/105105;
1456 _C4x[20] = (1792*_n-680)/315315;
1457 _C4x[21] = 64/
real(315315);
1458 _C4x[22] = (_n*(3072*_n-2560)+832)/405405;
1459 _C4x[23] = (2048*_n-384)/405405;
1460 _C4x[24] = -512/
real(405405);
1461 _C4x[25] = (640-2048*_n)/495495;
1462 _C4x[26] = -256/
real(495495);
1463 _C4x[27] = 512/
real(585585);
1466 _C4x[0] = (_n*(_n*(_n*(_n*(_n*(_n*(588*_n+952)+1700)+3536)+9724)+58344)-
1467 204204)+510510)/765765;
1468 _C4x[1] = (_n*(_n*(_n*(_n*(_n*(96*_n+272)+1088)+10608)-77792)+116688)-
1470 _C4x[2] = (_n*(_n*(_n*(_n*(3232*_n+28288)-181152)+240448)-77792)-14586)/
1472 _C4x[3] = (_n*(_n*((182512-154048*_n)*_n-3808)-81328)+26741)/765765;
1473 _C4x[4] = (_n*(_n*(12480*_n-76160)+18496)+2652)/765765;
1474 _C4x[5] = (_n*(20960*_n-7888)+4947)/765765;
1475 _C4x[6] = (4192*_n+850)/765765;
1476 _C4x[7] = 193/
real(85085);
1477 _C4x[8] = (_n*(_n*(_n*(_n*((-96*_n-272)*_n-1088)-10608)+77792)-116688)+
1479 _C4x[9] = (_n*(_n*(_n*((-1344*_n-13056)*_n+101184)-198016)+155584)-43758)/
1481 _C4x[10] = (_n*(_n*(_n*(103744*_n-181968)+98464)+17680)-21879)/2297295;
1482 _C4x[11] = (_n*(_n*(52608*_n+65280)-50048)+7956)/2297295;
1483 _C4x[12] = ((1904-39840*_n)*_n+255)/2297295;
1484 _C4x[13] = (510-1472*_n)/459459;
1485 _C4x[14] = 349/
real(2297295);
1486 _C4x[15] = (_n*(_n*(_n*(_n*(160*_n+2176)-24480)+70720)-77792)+29172)/
1488 _C4x[16] = (_n*(_n*((115328-41472*_n)*_n-143616)+84864)-19448)/3828825;
1489 _C4x[17] = (_n*((28288-126528*_n)*_n+31552)-15912)/3828825;
1490 _C4x[18] = (_n*(64256*_n-28288)+2856)/3828825;
1491 _C4x[19] = (-928*_n-612)/3828825;
1492 _C4x[20] = 464/
real(1276275);
1493 _C4x[21] = (_n*(_n*(_n*(7168*_n-30464)+60928)-56576)+19448)/5360355;
1494 _C4x[22] = (_n*(_n*(35840*_n-34816)+17408)-3536)/1786785;
1495 _C4x[23] = ((30464-2560*_n)*_n-11560)/5360355;
1496 _C4x[24] = (1088-16384*_n)/5360355;
1497 _C4x[25] = -16/
real(97461);
1498 _C4x[26] = (_n*((52224-32256*_n)*_n-43520)+14144)/6891885;
1499 _C4x[27] = ((34816-77824*_n)*_n-6528)/6891885;
1500 _C4x[28] = (26624*_n-8704)/6891885;
1501 _C4x[29] = 128/
real(2297295);
1502 _C4x[30] = (_n*(45056*_n-34816)+10880)/8423415;
1503 _C4x[31] = (24576*_n-4352)/8423415;
1504 _C4x[32] = -6784/
real(8423415);
1505 _C4x[33] = (8704-28672*_n)/9954945;
1506 _C4x[34] = -1024/
real(3318315);
1507 _C4x[35] = 1024/
real(1640925);
1510 GEOGRAPHICLIB_STATIC_ASSERT(nC4_ >= 0 && nC4_ <= 8,
"Bad value of nC4_");
static T AngNormalize(T x)
Header for GeographicLib::GeodesicLine class.
GeodesicLine Line(real lat1, real lon1, real azi1, unsigned caps=ALL) const
GeographicLib::Math::real real
static const Geodesic & WGS84()
Math::real GenInverse(real lat1, real lon1, real lat2, real lon2, unsigned outmask, real &s12, real &azi1, real &azi2, real &m12, real &M12, real &M21, real &S12) const
static bool isfinite(T x)
Mathematical functions needed by GeographicLib.
#define GEOGRAPHICLIB_VOLATILE
Header for GeographicLib::Geodesic class.
friend class GeodesicLine
Math::real GenDirect(real lat1, real lon1, real azi1, bool arcmode, real s12_a12, unsigned outmask, real &lat2, real &lon2, real &azi2, real &s12, real &m12, real &M12, real &M21, real &S12) const
Namespace for GeographicLib.
static T AngDiff(T x, T y)
Exception handling for GeographicLib.
#define GEOGRAPHICLIB_PANIC