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))
65 Math::eatanhe(real(1), (_f < 0 ? -1 : 1) * sqrt(abs(_e2))) / _e2)
77 , _etol2(0.1 * tol2_ /
78 sqrt( max(real(0.001), abs(_f)) * min(real(1), 1 - _f/2) / 2 ))
96 const real c[],
int n) {
104 ar = 2 * (cosx - sinx) * (cosx + sinx),
105 y0 = n & 1 ? *--c : 0, y1 = 0;
110 y1 = ar * y0 - y1 + *--c;
111 y0 = ar * y1 - y0 + *--c;
114 ? 2 * sinx * cosx * y0
124 bool arcmode, real s12_a12,
unsigned outmask,
125 real& lat2, real& lon2, real& azi2,
126 real& s12, real& m12, real& M12, real& M21,
132 GenPosition(arcmode, s12_a12, outmask,
133 lat2, lon2, azi2, s12, m12, M12, M21, S12);
138 real& s12, real& azi1, real& azi2,
139 real& m12, real& M12, real& M21, real& S12)
150 int lonsign = lon12 >= 0 ? 1 : -1;
156 int swapp = abs(lat1) >= abs(lat2) ? 1 : -1;
162 int latsign = lat1 < 0 ? 1 : -1;
177 real phi, sbet1, cbet1, sbet2, cbet2, s12x, m12x;
181 sbet1 = _f1 * sin(phi);
182 cbet1 = lat1 == -90 ? tiny_ : cos(phi);
187 sbet2 = _f1 * sin(phi);
188 cbet2 = abs(lat2) == 90 ? tiny_ : cos(phi);
199 if (cbet1 < -sbet1) {
201 sbet2 = sbet2 < 0 ? sbet1 : -sbet1;
203 if (abs(sbet2) == -sbet1)
208 dn1 = sqrt(1 + _ep2 *
Math::sq(sbet1)),
209 dn2 = sqrt(1 + _ep2 *
Math::sq(sbet2));
213 slam12 = abs(lon12) == 180 ? 0 : sin(lam12),
217 real a12, sig12, calp1, salp1, calp2 = 0, salp2 = 0;
219 real C1a[nC1_ + 1], C2a[nC2_ + 1], C3a[nC3_];
221 bool meridian = lat1 == -90 || slam12 == 0;
228 calp1 = clam12; salp1 = slam12;
229 calp2 = 1; salp2 = 0;
233 ssig1 = sbet1, csig1 = calp1 * cbet1,
234 ssig2 = sbet2, csig2 = calp2 * cbet2;
237 sig12 = atan2(max(csig1 * ssig2 - ssig1 * csig2, real(0)),
238 csig1 * csig2 + ssig1 * ssig2);
241 Lengths(_n, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
242 cbet1, cbet2, s12x, m12x, dummy,
252 if (sig12 < 1 || m12x >= 0) {
268 calp1 = calp2 = 0; salp1 = salp2 = 1;
270 sig12 = omg12 = lam12 / _f1;
271 m12x = _b * sin(sig12);
273 M12 = M21 = cos(sig12);
276 }
else if (!meridian) {
283 sig12 = InverseStart(sbet1, cbet1, dn1, sbet2, cbet2, dn2,
285 salp1, calp1, salp2, calp2, dnm,
290 s12x = sig12 * _b * dnm;
291 m12x =
Math::sq(dnm) * _b * sin(sig12 / dnm);
293 M12 = M21 = cos(sig12 / dnm);
295 omg12 = lam12 / (_f1 * dnm);
311 real ssig1 = 0, csig1 = 0, ssig2 = 0, csig2 = 0, eps = 0;
314 real salp1a = tiny_, calp1a = 1, salp1b = tiny_, calp1b = -1;
315 for (
bool tripn =
false, tripb =
false;
321 real v = Lambda12(sbet1, cbet1, dn1, sbet2, cbet2, dn2, salp1, calp1,
322 salp2, calp2, sig12, ssig1, csig1, ssig2, csig2,
323 eps, omg12, numit < maxit1_, dv, C1a, C2a, C3a)
327 if (tripb || !(abs(v) >= (tripn ? 8 : 2) * tol0_))
break;
329 if (v > 0 && (numit > maxit1_ || calp1/salp1 > calp1b/salp1b))
330 { salp1b = salp1; calp1b = calp1; }
331 else if (v < 0 && (numit > maxit1_ || calp1/salp1 < calp1a/salp1a))
332 { salp1a = salp1; calp1a = calp1; }
333 if (numit < maxit1_ && dv > 0) {
337 sdalp1 = sin(dalp1), cdalp1 = cos(dalp1),
338 nsalp1 = salp1 * cdalp1 + calp1 * sdalp1;
339 if (nsalp1 > 0 && abs(dalp1) <
Math::pi()) {
340 calp1 = calp1 * cdalp1 - salp1 * sdalp1;
346 tripn = abs(v) <= 16 * tol0_;
358 salp1 = (salp1a + salp1b)/2;
359 calp1 = (calp1a + calp1b)/2;
362 tripb = (abs(salp1a - salp1) + (calp1a - calp1) < tolb_ ||
363 abs(salp1 - salp1b) + (calp1 - calp1b) < tolb_);
367 Lengths(eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
368 cbet1, cbet2, s12x, m12x, dummy,
374 omg12 = lam12 - omg12;
384 if (outmask &
AREA) {
387 salp0 = salp1 * cbet1,
390 if (calp0 != 0 && salp0 != 0) {
393 ssig1 = sbet1, csig1 = calp1 * cbet1,
394 ssig2 = sbet2, csig2 = calp2 * cbet2,
396 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2),
398 A4 =
Math::sq(_a) * calp0 * salp0 * _e2;
404 B41 = SinCosSeries(
false, ssig1, csig1, C4a, nC4_),
405 B42 = SinCosSeries(
false, ssig2, csig2, C4a, nC4_);
406 S12 = A4 * (B42 - B41);
413 sbet2 - sbet1 < real(1.75)) {
418 somg12 = sin(omg12), domg12 = 1 + cos(omg12),
419 dbet1 = 1 + cbet1, dbet2 = 1 + cbet2;
420 alp12 = 2 * atan2( somg12 * ( sbet1 * dbet2 + sbet2 * dbet1 ),
421 domg12 * ( sbet1 * sbet2 + dbet1 * dbet2 ) );
425 salp12 = salp2 * calp1 - calp2 * salp1,
426 calp12 = calp2 * calp1 + salp2 * salp1;
431 if (salp12 == 0 && calp12 < 0) {
432 salp12 = tiny_ * calp1;
435 alp12 = atan2(salp12, calp12);
438 S12 *= swapp * lonsign * latsign;
451 salp1 *= swapp * lonsign; calp1 *= swapp * latsign;
452 salp2 *= swapp * lonsign; calp2 *= swapp * latsign;
464 void Geodesic::Lengths(
real eps,
real sig12,
478 AB1 = (1 + A1m1) * (SinCosSeries(
true, ssig2, csig2, C1a, nC1_) -
479 SinCosSeries(
true, ssig1, csig1, C1a, nC1_)),
481 AB2 = (1 + A2m1) * (SinCosSeries(
true, ssig2, csig2, C2a, nC2_) -
482 SinCosSeries(
true, ssig1, csig1, C2a, nC2_));
484 real J12 = m0 * sig12 + (AB1 - AB2);
488 m12b = dn2 * (csig1 * ssig2) - dn1 * (ssig1 * csig2) - csig1 * csig2 * J12;
490 s12b = (1 + A1m1) * sig12 + AB1;
492 real csig12 = csig1 * csig2 + ssig1 * ssig2;
493 real t = _ep2 * (cbet1 - cbet2) * (cbet1 + cbet2) / (dn1 + dn2);
494 M12 = csig12 + (t * ssig2 - csig2 * J12) * ssig1 / dn1;
495 M21 = csig12 - (t * ssig1 - csig1 * J12) * ssig2 / dn2;
507 if ( !(q == 0 && r <= 0) ) {
516 disc = S * (S + 2 * r3);
523 T3 += T3 < 0 ? -sqrt(disc) : sqrt(disc);
527 u += T + (T ? r2 / T : 0);
530 real ang = atan2(sqrt(-disc), -(S + r3));
533 u += 2 * r * cos(ang / 3);
538 uv = u < 0 ? q / (v - u) : u + v,
539 w = (uv - q) / (2 * v);
542 k = uv / (sqrt(uv +
Math::sq(w)) + w);
567 sbet12 = sbet2 * cbet1 - cbet2 * sbet1,
568 cbet12 = cbet2 * cbet1 + sbet2 * sbet1;
569 #if defined(__GNUC__) && __GNUC__ == 4 && \
570 (__GNUC_MINOR__ < 6 || defined(__MINGW32__))
584 real sbet12a = sbet2 * cbet1 + cbet2 * sbet1;
586 bool shortline = cbet12 >= 0 && sbet12 <
real(0.5) &&
587 cbet2 * lam12 <
real(0.5);
593 sbetm2 /= sbetm2 +
Math::sq(cbet1 + cbet2);
594 dnm = sqrt(1 + _ep2 * sbetm2);
597 real somg12 = sin(omg12), comg12 = cos(omg12);
599 salp1 = cbet2 * somg12;
600 calp1 = comg12 >= 0 ?
601 sbet12 + cbet2 * sbet1 *
Math::sq(somg12) / (1 + comg12) :
602 sbet12a - cbet2 * sbet1 *
Math::sq(somg12) / (1 - comg12);
606 csig12 = sbet1 * sbet2 + cbet1 * cbet2 * comg12;
608 if (shortline && ssig12 < _etol2) {
610 salp2 = cbet1 * somg12;
611 calp2 = sbet12 - cbet1 * sbet2 *
612 (comg12 >= 0 ?
Math::sq(somg12) / (1 + comg12) : 1 - comg12);
615 sig12 = atan2(ssig12, csig12);
616 }
else if (abs(_n) >
real(0.1) ||
623 real y, lamscale, betscale;
633 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2);
634 lamscale = _f * cbet1 * A3f(eps) *
Math::pi();
636 betscale = lamscale * cbet1;
638 x = (lam12 -
Math::pi()) / lamscale;
639 y = sbet12a / betscale;
643 cbet12a = cbet2 * cbet1 - sbet2 * sbet1,
644 bet12a = atan2(sbet12a, cbet12a);
645 real m12b, m0, dummy;
649 sbet1, -cbet1, dn1, sbet2, cbet2, dn2,
650 cbet1, cbet2, dummy, m12b, m0,
false,
651 dummy, dummy, C1a, C2a);
652 x = -1 + m12b / (cbet1 * cbet2 * m0 *
Math::pi());
653 betscale = x < -
real(0.01) ? sbet12a / x :
655 lamscale = betscale / cbet1;
656 y = (lam12 -
Math::pi()) / lamscale;
659 if (y > -tol1_ && x > -1 - xthresh_) {
665 calp1 = max(
real(x > -tol1_ ? 0 : -1),
real(x));
703 real k = Astroid(x, y);
705 omg12a = lamscale * ( _f >= 0 ? -x * k/(1 + k) : -y * (1 + k)/k );
706 somg12 = sin(omg12a); comg12 = -cos(omg12a);
708 salp1 = cbet2 * somg12;
709 calp1 = sbet12a - cbet2 * sbet1 *
Math::sq(somg12) / (1 - comg12);
716 salp1 = 1; calp1 = 0;
729 bool diffp,
real& dlam12,
733 if (sbet1 == 0 && calp1 == 0)
740 salp0 = salp1 * cbet1,
743 real somg1, comg1, somg2, comg2, omg12, lam12;
746 ssig1 = sbet1; somg1 = salp0 * sbet1;
747 csig1 = comg1 = calp1 * cbet1;
755 salp2 = cbet2 != cbet1 ? salp0 / cbet2 : salp1;
760 calp2 = cbet2 != cbet1 || abs(sbet2) != -sbet1 ?
763 (cbet2 - cbet1) * (cbet1 + cbet2) :
764 (sbet1 - sbet2) * (sbet1 + sbet2))) / cbet2 :
768 ssig2 = sbet2; somg2 = salp0 * sbet2;
769 csig2 = comg2 = calp2 * cbet2;
774 sig12 = atan2(max(csig1 * ssig2 - ssig1 * csig2,
real(0)),
775 csig1 * csig2 + ssig1 * ssig2);
778 omg12 = atan2(max(comg1 * somg2 - somg1 * comg2,
real(0)),
779 comg1 * comg2 + somg1 * somg2);
782 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2);
784 B312 = (SinCosSeries(
true, ssig2, csig2, C3a, nC3_-1) -
785 SinCosSeries(
true, ssig1, csig1, C3a, nC3_-1));
787 domg12 = salp0 * h0 * (sig12 + B312);
788 lam12 = omg12 + domg12;
792 dlam12 = - 2 * _f1 * dn1 / sbet1;
795 Lengths(eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
796 cbet1, cbet2, dummy, dlam12, dummy,
797 false, dummy, dummy, C1a, C2a);
798 dlam12 *= _f1 / (calp2 * cbet2);
808 for (
int i = nA3x_; i > 0; )
809 v = eps * v + _A3x[--i];
813 void Geodesic::C3f(
real eps,
real c[])
const {
816 for (
int j = nC3x_, k = nC3_ - 1; k > 0; ) {
818 for (
int i = nC3_ - k; i > 0; --i) {
819 t = eps * t + _C3x[--j];
825 for (
int k = 1; k < nC3_; ) {
831 void Geodesic::C4f(
real eps,
real c[])
const {
834 for (
int j = nC4x_, k = nC4_; k > 0; ) {
836 for (
int i = nC4_ - k + 1; i > 0; --i)
837 t = eps * t + _C4x[--j];
842 for (
int k = 1; k < nC4_; ) {
863 t = eps2*(eps2+16)/64;
866 t = eps2*(eps2*(eps2+4)+64)/256;
869 t = eps2*(eps2*(eps2*(25*eps2+64)+256)+4096)/16384;
872 GEOGRAPHICLIB_STATIC_ASSERT(nA1_ >= 0 && nA1_ <= 8,
"Bad value of nA1_");
875 return (t + eps) / (1 - eps);
879 void Geodesic::C1f(
real eps,
real c[]) {
895 c[1] = d*(3*eps2-8)/16;
902 c[1] = d*(3*eps2-8)/16;
904 c[2] = d*(eps2-2)/32;
911 c[1] = d*((6-eps2)*eps2-16)/32;
913 c[2] = d*(eps2-2)/32;
915 c[3] = d*(9*eps2-16)/768;
922 c[1] = d*((6-eps2)*eps2-16)/32;
924 c[2] = d*((64-9*eps2)*eps2-128)/2048;
926 c[3] = d*(9*eps2-16)/768;
928 c[4] = d*(3*eps2-5)/512;
935 c[1] = d*(eps2*(eps2*(19*eps2-64)+384)-1024)/2048;
937 c[2] = d*((64-9*eps2)*eps2-128)/2048;
939 c[3] = d*((72-9*eps2)*eps2-128)/6144;
941 c[4] = d*(3*eps2-5)/512;
943 c[5] = d*(35*eps2-56)/10240;
950 c[1] = d*(eps2*(eps2*(19*eps2-64)+384)-1024)/2048;
952 c[2] = d*(eps2*(eps2*(7*eps2-18)+128)-256)/4096;
954 c[3] = d*((72-9*eps2)*eps2-128)/6144;
956 c[4] = d*((96-11*eps2)*eps2-160)/16384;
958 c[5] = d*(35*eps2-56)/10240;
960 c[6] = d*(9*eps2-14)/4096;
964 c[8] = -429*d/262144;
967 GEOGRAPHICLIB_STATIC_ASSERT(nC1_ >= 0 && nC1_ <= 8,
"Bad value of nC1_");
972 void Geodesic::C1pf(
real eps,
real c[]) {
988 c[1] = d*(16-9*eps2)/32;
995 c[1] = d*(16-9*eps2)/32;
997 c[2] = d*(30-37*eps2)/96;
1004 c[1] = d*(eps2*(205*eps2-432)+768)/1536;
1006 c[2] = d*(30-37*eps2)/96;
1008 c[3] = d*(116-225*eps2)/384;
1015 c[1] = d*(eps2*(205*eps2-432)+768)/1536;
1017 c[2] = d*(eps2*(4005*eps2-4736)+3840)/12288;
1019 c[3] = d*(116-225*eps2)/384;
1021 c[4] = d*(2695-7173*eps2)/7680;
1025 c[6] = 38081*d/61440;
1028 c[1] = d*(eps2*((9840-4879*eps2)*eps2-20736)+36864)/73728;
1030 c[2] = d*(eps2*(4005*eps2-4736)+3840)/12288;
1032 c[3] = d*(eps2*(8703*eps2-7200)+3712)/12288;
1034 c[4] = d*(2695-7173*eps2)/7680;
1036 c[5] = d*(41604-141115*eps2)/92160;
1038 c[6] = 38081*d/61440;
1040 c[7] = 459485*d/516096;
1043 c[1] = d*(eps2*((9840-4879*eps2)*eps2-20736)+36864)/73728;
1045 c[2] = d*(eps2*((120150-86171*eps2)*eps2-142080)+115200)/368640;
1047 c[3] = d*(eps2*(8703*eps2-7200)+3712)/12288;
1049 c[4] = d*(eps2*(1082857*eps2-688608)+258720)/737280;
1051 c[5] = d*(41604-141115*eps2)/92160;
1053 c[6] = d*(533134-2200311*eps2)/860160;
1055 c[7] = 459485*d/516096;
1057 c[8] = 109167851*d/82575360;
1060 GEOGRAPHICLIB_STATIC_ASSERT(nC1p_ >= 0 && nC1p_ <= 8,
1061 "Bad value of nC1p_");
1078 t = eps2*(9*eps2+16)/64;
1081 t = eps2*(eps2*(25*eps2+36)+64)/256;
1084 t = eps2*(eps2*(eps2*(1225*eps2+1600)+2304)+4096)/16384;
1087 GEOGRAPHICLIB_STATIC_ASSERT(nA2_ >= 0 && nA2_ <= 8,
"Bad value of nA2_");
1090 return t * (1 - eps) - eps;
1094 void Geodesic::C2f(
real eps,
real c[]) {
1110 c[1] = d*(eps2+8)/16;
1117 c[1] = d*(eps2+8)/16;
1119 c[2] = d*(eps2+6)/32;
1126 c[1] = d*(eps2*(eps2+2)+16)/32;
1128 c[2] = d*(eps2+6)/32;
1130 c[3] = d*(15*eps2+80)/768;
1137 c[1] = d*(eps2*(eps2+2)+16)/32;
1139 c[2] = d*(eps2*(35*eps2+64)+384)/2048;
1141 c[3] = d*(15*eps2+80)/768;
1143 c[4] = d*(7*eps2+35)/512;
1150 c[1] = d*(eps2*(eps2*(41*eps2+64)+128)+1024)/2048;
1152 c[2] = d*(eps2*(35*eps2+64)+384)/2048;
1154 c[3] = d*(eps2*(69*eps2+120)+640)/6144;
1156 c[4] = d*(7*eps2+35)/512;
1158 c[5] = d*(105*eps2+504)/10240;
1165 c[1] = d*(eps2*(eps2*(41*eps2+64)+128)+1024)/2048;
1167 c[2] = d*(eps2*(eps2*(47*eps2+70)+128)+768)/4096;
1169 c[3] = d*(eps2*(69*eps2+120)+640)/6144;
1171 c[4] = d*(eps2*(133*eps2+224)+1120)/16384;
1173 c[5] = d*(105*eps2+504)/10240;
1175 c[6] = d*(33*eps2+154)/4096;
1179 c[8] = 6435*d/262144;
1182 GEOGRAPHICLIB_STATIC_ASSERT(nC2_ >= 0 && nC2_ <= 8,
"Bad value of nC2_");
1187 void Geodesic::A3coeff() {
1196 _A3x[1] = -1/
real(2);
1201 _A3x[2] = -1/
real(4);
1206 _A3x[2] = (-_n-2)/8;
1207 _A3x[3] = -1/
real(16);
1212 _A3x[2] = (_n*(3*_n-1)-2)/8;
1213 _A3x[3] = (-3*_n-1)/16;
1214 _A3x[4] = -3/
real(64);
1219 _A3x[2] = (_n*(3*_n-1)-2)/8;
1220 _A3x[3] = ((-_n-3)*_n-1)/16;
1221 _A3x[4] = (-2*_n-3)/64;
1222 _A3x[5] = -3/
real(128);
1227 _A3x[2] = (_n*(3*_n-1)-2)/8;
1228 _A3x[3] = (_n*(_n*(5*_n-1)-3)-1)/16;
1229 _A3x[4] = ((-10*_n-2)*_n-3)/64;
1230 _A3x[5] = (-5*_n-3)/128;
1231 _A3x[6] = -5/
real(256);
1236 _A3x[2] = (_n*(3*_n-1)-2)/8;
1237 _A3x[3] = (_n*(_n*(5*_n-1)-3)-1)/16;
1238 _A3x[4] = (_n*((-5*_n-20)*_n-4)-6)/128;
1239 _A3x[5] = ((-5*_n-10)*_n-6)/256;
1240 _A3x[6] = (-15*_n-20)/1024;
1241 _A3x[7] = -25/
real(2048);
1244 GEOGRAPHICLIB_STATIC_ASSERT(nA3_ >= 0 && nA3_ <= 8,
"Bad value of nA3_");
1249 void Geodesic::C3coeff() {
1256 _C3x[0] = 1/
real(4);
1260 _C3x[1] = 1/
real(8);
1261 _C3x[2] = 1/
real(16);
1265 _C3x[1] = 1/
real(8);
1266 _C3x[2] = 3/
real(64);
1267 _C3x[3] = (2-3*_n)/32;
1268 _C3x[4] = 3/
real(64);
1269 _C3x[5] = 5/
real(192);
1273 _C3x[1] = (1-_n*_n)/8;
1274 _C3x[2] = (3*_n+3)/64;
1275 _C3x[3] = 5/
real(128);
1276 _C3x[4] = ((_n-3)*_n+2)/32;
1277 _C3x[5] = (3-2*_n)/64;
1278 _C3x[6] = 3/
real(128);
1279 _C3x[7] = (5-9*_n)/192;
1280 _C3x[8] = 3/
real(128);
1281 _C3x[9] = 7/
real(512);
1285 _C3x[1] = (1-_n*_n)/8;
1286 _C3x[2] = ((3-_n)*_n+3)/64;
1287 _C3x[3] = (2*_n+5)/128;
1288 _C3x[4] = 3/
real(128);
1289 _C3x[5] = ((_n-3)*_n+2)/32;
1290 _C3x[6] = ((-3*_n-2)*_n+3)/64;
1291 _C3x[7] = (_n+3)/128;
1292 _C3x[8] = 5/
real(256);
1293 _C3x[9] = (_n*(5*_n-9)+5)/192;
1294 _C3x[10] = (9-10*_n)/384;
1295 _C3x[11] = 7/
real(512);
1296 _C3x[12] = (7-14*_n)/512;
1297 _C3x[13] = 7/
real(512);
1298 _C3x[14] = 21/
real(2560);
1302 _C3x[1] = (1-_n*_n)/8;
1303 _C3x[2] = (_n*((-5*_n-1)*_n+3)+3)/64;
1304 _C3x[3] = (_n*(2*_n+2)+5)/128;
1305 _C3x[4] = (11*_n+12)/512;
1306 _C3x[5] = 21/
real(1024);
1307 _C3x[6] = ((_n-3)*_n+2)/32;
1308 _C3x[7] = (_n*(_n*(2*_n-3)-2)+3)/64;
1309 _C3x[8] = ((2-9*_n)*_n+6)/256;
1310 _C3x[9] = (_n+5)/256;
1311 _C3x[10] = 27/
real(2048);
1312 _C3x[11] = (_n*((5-_n)*_n-9)+5)/192;
1313 _C3x[12] = ((-6*_n-10)*_n+9)/384;
1314 _C3x[13] = (21-4*_n)/1536;
1315 _C3x[14] = 3/
real(256);
1316 _C3x[15] = (_n*(10*_n-14)+7)/512;
1317 _C3x[16] = (7-10*_n)/512;
1318 _C3x[17] = 9/
real(1024);
1319 _C3x[18] = (21-45*_n)/2560;
1320 _C3x[19] = 9/
real(1024);
1321 _C3x[20] = 11/
real(2048);
1325 _C3x[1] = (1-_n*_n)/8;
1326 _C3x[2] = (_n*((-5*_n-1)*_n+3)+3)/64;
1327 _C3x[3] = (_n*((2-2*_n)*_n+2)+5)/128;
1328 _C3x[4] = (_n*(3*_n+11)+12)/512;
1329 _C3x[5] = (10*_n+21)/1024;
1330 _C3x[6] = 243/
real(16384);
1331 _C3x[7] = ((_n-3)*_n+2)/32;
1332 _C3x[8] = (_n*(_n*(2*_n-3)-2)+3)/64;
1333 _C3x[9] = (_n*((-6*_n-9)*_n+2)+6)/256;
1334 _C3x[10] = ((1-2*_n)*_n+5)/256;
1335 _C3x[11] = (69*_n+108)/8192;
1336 _C3x[12] = 187/
real(16384);
1337 _C3x[13] = (_n*((5-_n)*_n-9)+5)/192;
1338 _C3x[14] = (_n*(_n*(10*_n-6)-10)+9)/384;
1339 _C3x[15] = ((-77*_n-8)*_n+42)/3072;
1340 _C3x[16] = (12-_n)/1024;
1341 _C3x[17] = 139/
real(16384);
1342 _C3x[18] = (_n*((20-7*_n)*_n-28)+14)/1024;
1343 _C3x[19] = ((-7*_n-40)*_n+28)/2048;
1344 _C3x[20] = (72-43*_n)/8192;
1345 _C3x[21] = 127/
real(16384);
1346 _C3x[22] = (_n*(75*_n-90)+42)/5120;
1347 _C3x[23] = (9-15*_n)/1024;
1348 _C3x[24] = 99/
real(16384);
1349 _C3x[25] = (44-99*_n)/8192;
1350 _C3x[26] = 99/
real(16384);
1351 _C3x[27] = 429/
real(114688);
1354 GEOGRAPHICLIB_STATIC_ASSERT(nC3_ >= 0 && nC3_ <= 8,
"Bad value of nC3_");
1361 void Geodesic::C4coeff() {
1366 _C4x[0] = 2/
real(3);
1369 _C4x[0] = (10-4*_n)/15;
1370 _C4x[1] = -1/
real(5);
1371 _C4x[2] = 1/
real(45);
1374 _C4x[0] = (_n*(8*_n-28)+70)/105;
1375 _C4x[1] = (16*_n-7)/35;
1376 _C4x[2] = -2/
real(105);
1377 _C4x[3] = (7-16*_n)/315;
1378 _C4x[4] = -2/
real(105);
1379 _C4x[5] = 4/
real(525);
1382 _C4x[0] = (_n*(_n*(4*_n+24)-84)+210)/315;
1383 _C4x[1] = ((48-32*_n)*_n-21)/105;
1384 _C4x[2] = (-32*_n-6)/315;
1385 _C4x[3] = 11/
real(315);
1386 _C4x[4] = (_n*(32*_n-48)+21)/945;
1387 _C4x[5] = (64*_n-18)/945;
1388 _C4x[6] = -1/
real(105);
1389 _C4x[7] = (12-32*_n)/1575;
1390 _C4x[8] = -8/
real(1575);
1391 _C4x[9] = 8/
real(2205);
1394 _C4x[0] = (_n*(_n*(_n*(16*_n+44)+264)-924)+2310)/3465;
1395 _C4x[1] = (_n*(_n*(48*_n-352)+528)-231)/1155;
1396 _C4x[2] = (_n*(1088*_n-352)-66)/3465;
1397 _C4x[3] = (121-368*_n)/3465;
1398 _C4x[4] = 4/
real(1155);
1399 _C4x[5] = (_n*((352-48*_n)*_n-528)+231)/10395;
1400 _C4x[6] = ((704-896*_n)*_n-198)/10395;
1401 _C4x[7] = (80*_n-99)/10395;
1402 _C4x[8] = 4/
real(1155);
1403 _C4x[9] = (_n*(320*_n-352)+132)/17325;
1404 _C4x[10] = (384*_n-88)/17325;
1405 _C4x[11] = -8/
real(1925);
1406 _C4x[12] = (88-256*_n)/24255;
1407 _C4x[13] = -16/
real(8085);
1408 _C4x[14] = 64/
real(31185);
1411 _C4x[0] = (_n*(_n*(_n*(_n*(100*_n+208)+572)+3432)-12012)+30030)/45045;
1412 _C4x[1] = (_n*(_n*(_n*(64*_n+624)-4576)+6864)-3003)/15015;
1413 _C4x[2] = (_n*((14144-10656*_n)*_n-4576)-858)/45045;
1414 _C4x[3] = ((-224*_n-4784)*_n+1573)/45045;
1415 _C4x[4] = (1088*_n+156)/45045;
1416 _C4x[5] = 97/
real(15015);
1417 _C4x[6] = (_n*(_n*((-64*_n-624)*_n+4576)-6864)+3003)/135135;
1418 _C4x[7] = (_n*(_n*(5952*_n-11648)+9152)-2574)/135135;
1419 _C4x[8] = (_n*(5792*_n+1040)-1287)/135135;
1420 _C4x[9] = (468-2944*_n)/135135;
1421 _C4x[10] = 1/
real(9009);
1422 _C4x[11] = (_n*((4160-1440*_n)*_n-4576)+1716)/225225;
1423 _C4x[12] = ((4992-8448*_n)*_n-1144)/225225;
1424 _C4x[13] = (1856*_n-936)/225225;
1425 _C4x[14] = 8/
real(10725);
1426 _C4x[15] = (_n*(3584*_n-3328)+1144)/315315;
1427 _C4x[16] = (1024*_n-208)/105105;
1428 _C4x[17] = -136/
real(63063);
1429 _C4x[18] = (832-2560*_n)/405405;
1430 _C4x[19] = -128/
real(135135);
1431 _C4x[20] = 128/
real(99099);
1434 _C4x[0] = (_n*(_n*(_n*(_n*(_n*(56*_n+100)+208)+572)+3432)-12012)+30030)/
1436 _C4x[1] = (_n*(_n*(_n*(_n*(16*_n+64)+624)-4576)+6864)-3003)/15015;
1437 _C4x[2] = (_n*(_n*(_n*(1664*_n-10656)+14144)-4576)-858)/45045;
1438 _C4x[3] = (_n*(_n*(10736*_n-224)-4784)+1573)/45045;
1439 _C4x[4] = ((1088-4480*_n)*_n+156)/45045;
1440 _C4x[5] = (291-464*_n)/45045;
1441 _C4x[6] = 10/
real(9009);
1442 _C4x[7] = (_n*(_n*(_n*((-16*_n-64)*_n-624)+4576)-6864)+3003)/135135;
1443 _C4x[8] = (_n*(_n*((5952-768*_n)*_n-11648)+9152)-2574)/135135;
1444 _C4x[9] = (_n*((5792-10704*_n)*_n+1040)-1287)/135135;
1445 _C4x[10] = (_n*(3840*_n-2944)+468)/135135;
1446 _C4x[11] = (112*_n+15)/135135;
1447 _C4x[12] = 10/
real(9009);
1448 _C4x[13] = (_n*(_n*(_n*(128*_n-1440)+4160)-4576)+1716)/225225;
1449 _C4x[14] = (_n*(_n*(6784*_n-8448)+4992)-1144)/225225;
1450 _C4x[15] = (_n*(1664*_n+1856)-936)/225225;
1451 _C4x[16] = (168-1664*_n)/225225;
1452 _C4x[17] = -4/
real(25025);
1453 _C4x[18] = (_n*((3584-1792*_n)*_n-3328)+1144)/315315;
1454 _C4x[19] = ((1024-2048*_n)*_n-208)/105105;
1455 _C4x[20] = (1792*_n-680)/315315;
1456 _C4x[21] = 64/
real(315315);
1457 _C4x[22] = (_n*(3072*_n-2560)+832)/405405;
1458 _C4x[23] = (2048*_n-384)/405405;
1459 _C4x[24] = -512/
real(405405);
1460 _C4x[25] = (640-2048*_n)/495495;
1461 _C4x[26] = -256/
real(495495);
1462 _C4x[27] = 512/
real(585585);
1465 _C4x[0] = (_n*(_n*(_n*(_n*(_n*(_n*(588*_n+952)+1700)+3536)+9724)+58344)-
1466 204204)+510510)/765765;
1467 _C4x[1] = (_n*(_n*(_n*(_n*(_n*(96*_n+272)+1088)+10608)-77792)+116688)-
1469 _C4x[2] = (_n*(_n*(_n*(_n*(3232*_n+28288)-181152)+240448)-77792)-14586)/
1471 _C4x[3] = (_n*(_n*((182512-154048*_n)*_n-3808)-81328)+26741)/765765;
1472 _C4x[4] = (_n*(_n*(12480*_n-76160)+18496)+2652)/765765;
1473 _C4x[5] = (_n*(20960*_n-7888)+4947)/765765;
1474 _C4x[6] = (4192*_n+850)/765765;
1475 _C4x[7] = 193/
real(85085);
1476 _C4x[8] = (_n*(_n*(_n*(_n*((-96*_n-272)*_n-1088)-10608)+77792)-116688)+
1478 _C4x[9] = (_n*(_n*(_n*((-1344*_n-13056)*_n+101184)-198016)+155584)-43758)/
1480 _C4x[10] = (_n*(_n*(_n*(103744*_n-181968)+98464)+17680)-21879)/2297295;
1481 _C4x[11] = (_n*(_n*(52608*_n+65280)-50048)+7956)/2297295;
1482 _C4x[12] = ((1904-39840*_n)*_n+255)/2297295;
1483 _C4x[13] = (510-1472*_n)/459459;
1484 _C4x[14] = 349/
real(2297295);
1485 _C4x[15] = (_n*(_n*(_n*(_n*(160*_n+2176)-24480)+70720)-77792)+29172)/
1487 _C4x[16] = (_n*(_n*((115328-41472*_n)*_n-143616)+84864)-19448)/3828825;
1488 _C4x[17] = (_n*((28288-126528*_n)*_n+31552)-15912)/3828825;
1489 _C4x[18] = (_n*(64256*_n-28288)+2856)/3828825;
1490 _C4x[19] = (-928*_n-612)/3828825;
1491 _C4x[20] = 464/
real(1276275);
1492 _C4x[21] = (_n*(_n*(_n*(7168*_n-30464)+60928)-56576)+19448)/5360355;
1493 _C4x[22] = (_n*(_n*(35840*_n-34816)+17408)-3536)/1786785;
1494 _C4x[23] = ((30464-2560*_n)*_n-11560)/5360355;
1495 _C4x[24] = (1088-16384*_n)/5360355;
1496 _C4x[25] = -16/
real(97461);
1497 _C4x[26] = (_n*((52224-32256*_n)*_n-43520)+14144)/6891885;
1498 _C4x[27] = ((34816-77824*_n)*_n-6528)/6891885;
1499 _C4x[28] = (26624*_n-8704)/6891885;
1500 _C4x[29] = 128/
real(2297295);
1501 _C4x[30] = (_n*(45056*_n-34816)+10880)/8423415;
1502 _C4x[31] = (24576*_n-4352)/8423415;
1503 _C4x[32] = -6784/
real(8423415);
1504 _C4x[33] = (8704-28672*_n)/9954945;
1505 _C4x[34] = -1024/
real(3318315);
1506 _C4x[35] = 1024/
real(1640925);
1509 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.
static void norm(T &x, T &y)
#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
static T atan2d(T y, T x)
Namespace for GeographicLib.
static T AngDiff(T x, T y)
Exception handling for GeographicLib.
#define GEOGRAPHICLIB_PANIC