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),
217 real a12, sig12, calp1, salp1, calp2, salp2;
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);
309 real ssig1, csig1, ssig2, csig2, eps;
312 real salp1a = tiny_, calp1a = 1, salp1b = tiny_, calp1b = -1;
313 for (
bool tripn =
false, tripb =
false;
319 real v = Lambda12(sbet1, cbet1, dn1, sbet2, cbet2, dn2, salp1, calp1,
320 salp2, calp2, sig12, ssig1, csig1, ssig2, csig2,
321 eps, omg12, numit < maxit1_, dv, C1a, C2a, C3a)
325 if (tripb || !(abs(v) >= (tripn ? 8 : 2) * tol0_))
break;
327 if (v > 0 && (numit > maxit1_ || calp1/salp1 > calp1b/salp1b))
328 { salp1b = salp1; calp1b = calp1; }
329 else if (v < 0 && (numit > maxit1_ || calp1/salp1 < calp1a/salp1a))
330 { salp1a = salp1; calp1a = calp1; }
331 if (numit < maxit1_ && dv > 0) {
335 sdalp1 = sin(dalp1), cdalp1 = cos(dalp1),
336 nsalp1 = salp1 * cdalp1 + calp1 * sdalp1;
337 if (nsalp1 > 0 && abs(dalp1) <
Math::pi()) {
338 calp1 = calp1 * cdalp1 - salp1 * sdalp1;
340 SinCosNorm(salp1, calp1);
344 tripn = abs(v) <= 16 * tol0_;
356 salp1 = (salp1a + salp1b)/2;
357 calp1 = (calp1a + calp1b)/2;
358 SinCosNorm(salp1, calp1);
360 tripb = (abs(salp1a - salp1) + (calp1a - calp1) < tolb_ ||
361 abs(salp1 - salp1b) + (calp1 - calp1b) < tolb_);
365 Lengths(eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
366 cbet1, cbet2, s12x, m12x, dummy,
372 omg12 = lam12 - omg12;
382 if (outmask &
AREA) {
385 salp0 = salp1 * cbet1,
388 if (calp0 != 0 && salp0 != 0) {
391 ssig1 = sbet1, csig1 = calp1 * cbet1,
392 ssig2 = sbet2, csig2 = calp2 * cbet2,
394 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2),
396 A4 =
Math::sq(_a) * calp0 * salp0 * _e2;
397 SinCosNorm(ssig1, csig1);
398 SinCosNorm(ssig2, csig2);
402 B41 = SinCosSeries(
false, ssig1, csig1, C4a, nC4_),
403 B42 = SinCosSeries(
false, ssig2, csig2, C4a, nC4_);
404 S12 = A4 * (B42 - B41);
411 sbet2 - sbet1 < real(1.75)) {
416 somg12 = sin(omg12), domg12 = 1 + cos(omg12),
417 dbet1 = 1 + cbet1, dbet2 = 1 + cbet2;
418 alp12 = 2 * atan2( somg12 * ( sbet1 * dbet2 + sbet2 * dbet1 ),
419 domg12 * ( sbet1 * sbet2 + dbet1 * dbet2 ) );
423 salp12 = salp2 * calp1 - calp2 * salp1,
424 calp12 = calp2 * calp1 + salp2 * salp1;
429 if (salp12 == 0 && calp12 < 0) {
430 salp12 = tiny_ * calp1;
433 alp12 = atan2(salp12, calp12);
436 S12 *= swapp * lonsign * latsign;
449 salp1 *= swapp * lonsign; calp1 *= swapp * latsign;
450 salp2 *= swapp * lonsign; calp2 *= swapp * latsign;
462 void Geodesic::Lengths(
real eps,
real sig12,
476 AB1 = (1 + A1m1) * (SinCosSeries(
true, ssig2, csig2, C1a, nC1_) -
477 SinCosSeries(
true, ssig1, csig1, C1a, nC1_)),
479 AB2 = (1 + A2m1) * (SinCosSeries(
true, ssig2, csig2, C2a, nC2_) -
480 SinCosSeries(
true, ssig1, csig1, C2a, nC2_));
482 real J12 = m0 * sig12 + (AB1 - AB2);
486 m12b = dn2 * (csig1 * ssig2) - dn1 * (ssig1 * csig2) - csig1 * csig2 * J12;
488 s12b = (1 + A1m1) * sig12 + AB1;
490 real csig12 = csig1 * csig2 + ssig1 * ssig2;
491 real t = _ep2 * (cbet1 - cbet2) * (cbet1 + cbet2) / (dn1 + dn2);
492 M12 = csig12 + (t * ssig2 - csig2 * J12) * ssig1 / dn1;
493 M21 = csig12 - (t * ssig1 - csig1 * J12) * ssig2 / dn2;
505 if ( !(q == 0 && r <= 0) ) {
514 disc = S * (S + 2 * r3);
521 T3 += T3 < 0 ? -sqrt(disc) : sqrt(disc);
525 u += T + (T ? r2 / T : 0);
528 real ang = atan2(sqrt(-disc), -(S + r3));
531 u += 2 * r * cos(ang / 3);
536 uv = u < 0 ? q / (v - u) : u + v,
537 w = (uv - q) / (2 * v);
540 k = uv / (sqrt(uv +
Math::sq(w)) + w);
565 sbet12 = sbet2 * cbet1 - cbet2 * sbet1,
566 cbet12 = cbet2 * cbet1 + sbet2 * sbet1;
567 #if defined(__GNUC__) && __GNUC__ == 4 && \
568 (__GNUC_MINOR__ < 6 || defined(__MINGW32__))
582 real sbet12a = sbet2 * cbet1 + cbet2 * sbet1;
584 bool shortline = cbet12 >= 0 && sbet12 <
real(0.5) &&
585 cbet2 * lam12 <
real(0.5);
591 sbetm2 /= sbetm2 +
Math::sq(cbet1 + cbet2);
592 dnm = sqrt(1 + _ep2 * sbetm2);
595 real somg12 = sin(omg12), comg12 = cos(omg12);
597 salp1 = cbet2 * somg12;
598 calp1 = comg12 >= 0 ?
599 sbet12 + cbet2 * sbet1 *
Math::sq(somg12) / (1 + comg12) :
600 sbet12a - cbet2 * sbet1 *
Math::sq(somg12) / (1 - comg12);
604 csig12 = sbet1 * sbet2 + cbet1 * cbet2 * comg12;
606 if (shortline && ssig12 < _etol2) {
608 salp2 = cbet1 * somg12;
609 calp2 = sbet12 - cbet1 * sbet2 *
610 (comg12 >= 0 ?
Math::sq(somg12) / (1 + comg12) : 1 - comg12);
611 SinCosNorm(salp2, calp2);
613 sig12 = atan2(ssig12, csig12);
614 }
else if (abs(_n) >
real(0.1) ||
621 real y, lamscale, betscale;
631 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2);
632 lamscale = _f * cbet1 * A3f(eps) *
Math::pi();
634 betscale = lamscale * cbet1;
636 x = (lam12 -
Math::pi()) / lamscale;
637 y = sbet12a / betscale;
641 cbet12a = cbet2 * cbet1 - sbet2 * sbet1,
642 bet12a = atan2(sbet12a, cbet12a);
643 real m12b, m0, dummy;
647 sbet1, -cbet1, dn1, sbet2, cbet2, dn2,
648 cbet1, cbet2, dummy, m12b, m0,
false,
649 dummy, dummy, C1a, C2a);
650 x = -1 + m12b / (cbet1 * cbet2 * m0 *
Math::pi());
651 betscale = x < -
real(0.01) ? sbet12a / x :
653 lamscale = betscale / cbet1;
654 y = (lam12 -
Math::pi()) / lamscale;
657 if (y > -tol1_ && x > -1 - xthresh_) {
663 calp1 = max(
real(x > -tol1_ ? 0 : -1),
real(x));
701 real k = Astroid(x, y);
703 omg12a = lamscale * ( _f >= 0 ? -x * k/(1 + k) : -y * (1 + k)/k );
704 somg12 = sin(omg12a); comg12 = -cos(omg12a);
706 salp1 = cbet2 * somg12;
707 calp1 = sbet12a - cbet2 * sbet1 *
Math::sq(somg12) / (1 - comg12);
711 SinCosNorm(salp1, calp1);
713 salp1 = 1; calp1 = 0;
726 bool diffp,
real& dlam12,
730 if (sbet1 == 0 && calp1 == 0)
737 salp0 = salp1 * cbet1,
740 real somg1, comg1, somg2, comg2, omg12, lam12;
743 ssig1 = sbet1; somg1 = salp0 * sbet1;
744 csig1 = comg1 = calp1 * cbet1;
745 SinCosNorm(ssig1, csig1);
752 salp2 = cbet2 != cbet1 ? salp0 / cbet2 : salp1;
757 calp2 = cbet2 != cbet1 || abs(sbet2) != -sbet1 ?
760 (cbet2 - cbet1) * (cbet1 + cbet2) :
761 (sbet1 - sbet2) * (sbet1 + sbet2))) / cbet2 :
765 ssig2 = sbet2; somg2 = salp0 * sbet2;
766 csig2 = comg2 = calp2 * cbet2;
767 SinCosNorm(ssig2, csig2);
771 sig12 = atan2(max(csig1 * ssig2 - ssig1 * csig2,
real(0)),
772 csig1 * csig2 + ssig1 * ssig2);
775 omg12 = atan2(max(comg1 * somg2 - somg1 * comg2,
real(0)),
776 comg1 * comg2 + somg1 * somg2);
779 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2);
781 B312 = (SinCosSeries(
true, ssig2, csig2, C3a, nC3_-1) -
782 SinCosSeries(
true, ssig1, csig1, C3a, nC3_-1));
784 domg12 = salp0 * h0 * (sig12 + B312);
785 lam12 = omg12 + domg12;
789 dlam12 = - 2 * _f1 * dn1 / sbet1;
792 Lengths(eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
793 cbet1, cbet2, dummy, dlam12, dummy,
794 false, dummy, dummy, C1a, C2a);
795 dlam12 *= _f1 / (calp2 * cbet2);
805 for (
int i = nA3x_; i > 0; )
806 v = eps * v + _A3x[--i];
810 void Geodesic::C3f(
real eps,
real c[])
const {
813 for (
int j = nC3x_, k = nC3_ - 1; k > 0; ) {
815 for (
int i = nC3_ - k; i > 0; --i) {
816 t = eps * t + _C3x[--j];
822 for (
int k = 1; k < nC3_; ) {
828 void Geodesic::C4f(
real eps,
real c[])
const {
831 for (
int j = nC4x_, k = nC4_; k > 0; ) {
833 for (
int i = nC4_ - k + 1; i > 0; --i)
834 t = eps * t + _C4x[--j];
839 for (
int k = 1; k < nC4_; ) {
860 t = eps2*(eps2+16)/64;
863 t = eps2*(eps2*(eps2+4)+64)/256;
866 t = eps2*(eps2*(eps2*(25*eps2+64)+256)+4096)/16384;
869 GEOGRAPHICLIB_STATIC_ASSERT(nA1_ >= 0 && nA1_ <= 8,
"Bad value of nA1_");
872 return (t + eps) / (1 - eps);
876 void Geodesic::C1f(
real eps,
real c[]) {
892 c[1] = d*(3*eps2-8)/16;
899 c[1] = d*(3*eps2-8)/16;
901 c[2] = d*(eps2-2)/32;
908 c[1] = d*((6-eps2)*eps2-16)/32;
910 c[2] = d*(eps2-2)/32;
912 c[3] = d*(9*eps2-16)/768;
919 c[1] = d*((6-eps2)*eps2-16)/32;
921 c[2] = d*((64-9*eps2)*eps2-128)/2048;
923 c[3] = d*(9*eps2-16)/768;
925 c[4] = d*(3*eps2-5)/512;
932 c[1] = d*(eps2*(eps2*(19*eps2-64)+384)-1024)/2048;
934 c[2] = d*((64-9*eps2)*eps2-128)/2048;
936 c[3] = d*((72-9*eps2)*eps2-128)/6144;
938 c[4] = d*(3*eps2-5)/512;
940 c[5] = d*(35*eps2-56)/10240;
947 c[1] = d*(eps2*(eps2*(19*eps2-64)+384)-1024)/2048;
949 c[2] = d*(eps2*(eps2*(7*eps2-18)+128)-256)/4096;
951 c[3] = d*((72-9*eps2)*eps2-128)/6144;
953 c[4] = d*((96-11*eps2)*eps2-160)/16384;
955 c[5] = d*(35*eps2-56)/10240;
957 c[6] = d*(9*eps2-14)/4096;
961 c[8] = -429*d/262144;
964 GEOGRAPHICLIB_STATIC_ASSERT(nC1_ >= 0 && nC1_ <= 8,
"Bad value of nC1_");
969 void Geodesic::C1pf(
real eps,
real c[]) {
985 c[1] = d*(16-9*eps2)/32;
992 c[1] = d*(16-9*eps2)/32;
994 c[2] = d*(30-37*eps2)/96;
1001 c[1] = d*(eps2*(205*eps2-432)+768)/1536;
1003 c[2] = d*(30-37*eps2)/96;
1005 c[3] = d*(116-225*eps2)/384;
1012 c[1] = d*(eps2*(205*eps2-432)+768)/1536;
1014 c[2] = d*(eps2*(4005*eps2-4736)+3840)/12288;
1016 c[3] = d*(116-225*eps2)/384;
1018 c[4] = d*(2695-7173*eps2)/7680;
1022 c[6] = 38081*d/61440;
1025 c[1] = d*(eps2*((9840-4879*eps2)*eps2-20736)+36864)/73728;
1027 c[2] = d*(eps2*(4005*eps2-4736)+3840)/12288;
1029 c[3] = d*(eps2*(8703*eps2-7200)+3712)/12288;
1031 c[4] = d*(2695-7173*eps2)/7680;
1033 c[5] = d*(41604-141115*eps2)/92160;
1035 c[6] = 38081*d/61440;
1037 c[7] = 459485*d/516096;
1040 c[1] = d*(eps2*((9840-4879*eps2)*eps2-20736)+36864)/73728;
1042 c[2] = d*(eps2*((120150-86171*eps2)*eps2-142080)+115200)/368640;
1044 c[3] = d*(eps2*(8703*eps2-7200)+3712)/12288;
1046 c[4] = d*(eps2*(1082857*eps2-688608)+258720)/737280;
1048 c[5] = d*(41604-141115*eps2)/92160;
1050 c[6] = d*(533134-2200311*eps2)/860160;
1052 c[7] = 459485*d/516096;
1054 c[8] = 109167851*d/82575360;
1057 GEOGRAPHICLIB_STATIC_ASSERT(nC1p_ >= 0 && nC1p_ <= 8,
1058 "Bad value of nC1p_");
1075 t = eps2*(9*eps2+16)/64;
1078 t = eps2*(eps2*(25*eps2+36)+64)/256;
1081 t = eps2*(eps2*(eps2*(1225*eps2+1600)+2304)+4096)/16384;
1084 GEOGRAPHICLIB_STATIC_ASSERT(nA2_ >= 0 && nA2_ <= 8,
"Bad value of nA2_");
1087 return t * (1 - eps) - eps;
1091 void Geodesic::C2f(
real eps,
real c[]) {
1107 c[1] = d*(eps2+8)/16;
1114 c[1] = d*(eps2+8)/16;
1116 c[2] = d*(eps2+6)/32;
1123 c[1] = d*(eps2*(eps2+2)+16)/32;
1125 c[2] = d*(eps2+6)/32;
1127 c[3] = d*(15*eps2+80)/768;
1134 c[1] = d*(eps2*(eps2+2)+16)/32;
1136 c[2] = d*(eps2*(35*eps2+64)+384)/2048;
1138 c[3] = d*(15*eps2+80)/768;
1140 c[4] = d*(7*eps2+35)/512;
1147 c[1] = d*(eps2*(eps2*(41*eps2+64)+128)+1024)/2048;
1149 c[2] = d*(eps2*(35*eps2+64)+384)/2048;
1151 c[3] = d*(eps2*(69*eps2+120)+640)/6144;
1153 c[4] = d*(7*eps2+35)/512;
1155 c[5] = d*(105*eps2+504)/10240;
1162 c[1] = d*(eps2*(eps2*(41*eps2+64)+128)+1024)/2048;
1164 c[2] = d*(eps2*(eps2*(47*eps2+70)+128)+768)/4096;
1166 c[3] = d*(eps2*(69*eps2+120)+640)/6144;
1168 c[4] = d*(eps2*(133*eps2+224)+1120)/16384;
1170 c[5] = d*(105*eps2+504)/10240;
1172 c[6] = d*(33*eps2+154)/4096;
1176 c[8] = 6435*d/262144;
1179 GEOGRAPHICLIB_STATIC_ASSERT(nC2_ >= 0 && nC2_ <= 8,
"Bad value of nC2_");
1184 void Geodesic::A3coeff() {
1193 _A3x[1] = -1/
real(2);
1198 _A3x[2] = -1/
real(4);
1203 _A3x[2] = (-_n-2)/8;
1204 _A3x[3] = -1/
real(16);
1209 _A3x[2] = (_n*(3*_n-1)-2)/8;
1210 _A3x[3] = (-3*_n-1)/16;
1211 _A3x[4] = -3/
real(64);
1216 _A3x[2] = (_n*(3*_n-1)-2)/8;
1217 _A3x[3] = ((-_n-3)*_n-1)/16;
1218 _A3x[4] = (-2*_n-3)/64;
1219 _A3x[5] = -3/
real(128);
1224 _A3x[2] = (_n*(3*_n-1)-2)/8;
1225 _A3x[3] = (_n*(_n*(5*_n-1)-3)-1)/16;
1226 _A3x[4] = ((-10*_n-2)*_n-3)/64;
1227 _A3x[5] = (-5*_n-3)/128;
1228 _A3x[6] = -5/
real(256);
1233 _A3x[2] = (_n*(3*_n-1)-2)/8;
1234 _A3x[3] = (_n*(_n*(5*_n-1)-3)-1)/16;
1235 _A3x[4] = (_n*((-5*_n-20)*_n-4)-6)/128;
1236 _A3x[5] = ((-5*_n-10)*_n-6)/256;
1237 _A3x[6] = (-15*_n-20)/1024;
1238 _A3x[7] = -25/
real(2048);
1241 GEOGRAPHICLIB_STATIC_ASSERT(nA3_ >= 0 && nA3_ <= 8,
"Bad value of nA3_");
1246 void Geodesic::C3coeff() {
1253 _C3x[0] = 1/
real(4);
1257 _C3x[1] = 1/
real(8);
1258 _C3x[2] = 1/
real(16);
1262 _C3x[1] = 1/
real(8);
1263 _C3x[2] = 3/
real(64);
1264 _C3x[3] = (2-3*_n)/32;
1265 _C3x[4] = 3/
real(64);
1266 _C3x[5] = 5/
real(192);
1270 _C3x[1] = (1-_n*_n)/8;
1271 _C3x[2] = (3*_n+3)/64;
1272 _C3x[3] = 5/
real(128);
1273 _C3x[4] = ((_n-3)*_n+2)/32;
1274 _C3x[5] = (3-2*_n)/64;
1275 _C3x[6] = 3/
real(128);
1276 _C3x[7] = (5-9*_n)/192;
1277 _C3x[8] = 3/
real(128);
1278 _C3x[9] = 7/
real(512);
1282 _C3x[1] = (1-_n*_n)/8;
1283 _C3x[2] = ((3-_n)*_n+3)/64;
1284 _C3x[3] = (2*_n+5)/128;
1285 _C3x[4] = 3/
real(128);
1286 _C3x[5] = ((_n-3)*_n+2)/32;
1287 _C3x[6] = ((-3*_n-2)*_n+3)/64;
1288 _C3x[7] = (_n+3)/128;
1289 _C3x[8] = 5/
real(256);
1290 _C3x[9] = (_n*(5*_n-9)+5)/192;
1291 _C3x[10] = (9-10*_n)/384;
1292 _C3x[11] = 7/
real(512);
1293 _C3x[12] = (7-14*_n)/512;
1294 _C3x[13] = 7/
real(512);
1295 _C3x[14] = 21/
real(2560);
1299 _C3x[1] = (1-_n*_n)/8;
1300 _C3x[2] = (_n*((-5*_n-1)*_n+3)+3)/64;
1301 _C3x[3] = (_n*(2*_n+2)+5)/128;
1302 _C3x[4] = (11*_n+12)/512;
1303 _C3x[5] = 21/
real(1024);
1304 _C3x[6] = ((_n-3)*_n+2)/32;
1305 _C3x[7] = (_n*(_n*(2*_n-3)-2)+3)/64;
1306 _C3x[8] = ((2-9*_n)*_n+6)/256;
1307 _C3x[9] = (_n+5)/256;
1308 _C3x[10] = 27/
real(2048);
1309 _C3x[11] = (_n*((5-_n)*_n-9)+5)/192;
1310 _C3x[12] = ((-6*_n-10)*_n+9)/384;
1311 _C3x[13] = (21-4*_n)/1536;
1312 _C3x[14] = 3/
real(256);
1313 _C3x[15] = (_n*(10*_n-14)+7)/512;
1314 _C3x[16] = (7-10*_n)/512;
1315 _C3x[17] = 9/
real(1024);
1316 _C3x[18] = (21-45*_n)/2560;
1317 _C3x[19] = 9/
real(1024);
1318 _C3x[20] = 11/
real(2048);
1322 _C3x[1] = (1-_n*_n)/8;
1323 _C3x[2] = (_n*((-5*_n-1)*_n+3)+3)/64;
1324 _C3x[3] = (_n*((2-2*_n)*_n+2)+5)/128;
1325 _C3x[4] = (_n*(3*_n+11)+12)/512;
1326 _C3x[5] = (10*_n+21)/1024;
1327 _C3x[6] = 243/
real(16384);
1328 _C3x[7] = ((_n-3)*_n+2)/32;
1329 _C3x[8] = (_n*(_n*(2*_n-3)-2)+3)/64;
1330 _C3x[9] = (_n*((-6*_n-9)*_n+2)+6)/256;
1331 _C3x[10] = ((1-2*_n)*_n+5)/256;
1332 _C3x[11] = (69*_n+108)/8192;
1333 _C3x[12] = 187/
real(16384);
1334 _C3x[13] = (_n*((5-_n)*_n-9)+5)/192;
1335 _C3x[14] = (_n*(_n*(10*_n-6)-10)+9)/384;
1336 _C3x[15] = ((-77*_n-8)*_n+42)/3072;
1337 _C3x[16] = (12-_n)/1024;
1338 _C3x[17] = 139/
real(16384);
1339 _C3x[18] = (_n*((20-7*_n)*_n-28)+14)/1024;
1340 _C3x[19] = ((-7*_n-40)*_n+28)/2048;
1341 _C3x[20] = (72-43*_n)/8192;
1342 _C3x[21] = 127/
real(16384);
1343 _C3x[22] = (_n*(75*_n-90)+42)/5120;
1344 _C3x[23] = (9-15*_n)/1024;
1345 _C3x[24] = 99/
real(16384);
1346 _C3x[25] = (44-99*_n)/8192;
1347 _C3x[26] = 99/
real(16384);
1348 _C3x[27] = 429/
real(114688);
1351 GEOGRAPHICLIB_STATIC_ASSERT(nC3_ >= 0 && nC3_ <= 8,
"Bad value of nC3_");
1358 void Geodesic::C4coeff() {
1363 _C4x[0] = 2/
real(3);
1366 _C4x[0] = (10-4*_n)/15;
1367 _C4x[1] = -1/
real(5);
1368 _C4x[2] = 1/
real(45);
1371 _C4x[0] = (_n*(8*_n-28)+70)/105;
1372 _C4x[1] = (16*_n-7)/35;
1373 _C4x[2] = -2/
real(105);
1374 _C4x[3] = (7-16*_n)/315;
1375 _C4x[4] = -2/
real(105);
1376 _C4x[5] = 4/
real(525);
1379 _C4x[0] = (_n*(_n*(4*_n+24)-84)+210)/315;
1380 _C4x[1] = ((48-32*_n)*_n-21)/105;
1381 _C4x[2] = (-32*_n-6)/315;
1382 _C4x[3] = 11/
real(315);
1383 _C4x[4] = (_n*(32*_n-48)+21)/945;
1384 _C4x[5] = (64*_n-18)/945;
1385 _C4x[6] = -1/
real(105);
1386 _C4x[7] = (12-32*_n)/1575;
1387 _C4x[8] = -8/
real(1575);
1388 _C4x[9] = 8/
real(2205);
1391 _C4x[0] = (_n*(_n*(_n*(16*_n+44)+264)-924)+2310)/3465;
1392 _C4x[1] = (_n*(_n*(48*_n-352)+528)-231)/1155;
1393 _C4x[2] = (_n*(1088*_n-352)-66)/3465;
1394 _C4x[3] = (121-368*_n)/3465;
1395 _C4x[4] = 4/
real(1155);
1396 _C4x[5] = (_n*((352-48*_n)*_n-528)+231)/10395;
1397 _C4x[6] = ((704-896*_n)*_n-198)/10395;
1398 _C4x[7] = (80*_n-99)/10395;
1399 _C4x[8] = 4/
real(1155);
1400 _C4x[9] = (_n*(320*_n-352)+132)/17325;
1401 _C4x[10] = (384*_n-88)/17325;
1402 _C4x[11] = -8/
real(1925);
1403 _C4x[12] = (88-256*_n)/24255;
1404 _C4x[13] = -16/
real(8085);
1405 _C4x[14] = 64/
real(31185);
1408 _C4x[0] = (_n*(_n*(_n*(_n*(100*_n+208)+572)+3432)-12012)+30030)/45045;
1409 _C4x[1] = (_n*(_n*(_n*(64*_n+624)-4576)+6864)-3003)/15015;
1410 _C4x[2] = (_n*((14144-10656*_n)*_n-4576)-858)/45045;
1411 _C4x[3] = ((-224*_n-4784)*_n+1573)/45045;
1412 _C4x[4] = (1088*_n+156)/45045;
1413 _C4x[5] = 97/
real(15015);
1414 _C4x[6] = (_n*(_n*((-64*_n-624)*_n+4576)-6864)+3003)/135135;
1415 _C4x[7] = (_n*(_n*(5952*_n-11648)+9152)-2574)/135135;
1416 _C4x[8] = (_n*(5792*_n+1040)-1287)/135135;
1417 _C4x[9] = (468-2944*_n)/135135;
1418 _C4x[10] = 1/
real(9009);
1419 _C4x[11] = (_n*((4160-1440*_n)*_n-4576)+1716)/225225;
1420 _C4x[12] = ((4992-8448*_n)*_n-1144)/225225;
1421 _C4x[13] = (1856*_n-936)/225225;
1422 _C4x[14] = 8/
real(10725);
1423 _C4x[15] = (_n*(3584*_n-3328)+1144)/315315;
1424 _C4x[16] = (1024*_n-208)/105105;
1425 _C4x[17] = -136/
real(63063);
1426 _C4x[18] = (832-2560*_n)/405405;
1427 _C4x[19] = -128/
real(135135);
1428 _C4x[20] = 128/
real(99099);
1431 _C4x[0] = (_n*(_n*(_n*(_n*(_n*(56*_n+100)+208)+572)+3432)-12012)+30030)/
1433 _C4x[1] = (_n*(_n*(_n*(_n*(16*_n+64)+624)-4576)+6864)-3003)/15015;
1434 _C4x[2] = (_n*(_n*(_n*(1664*_n-10656)+14144)-4576)-858)/45045;
1435 _C4x[3] = (_n*(_n*(10736*_n-224)-4784)+1573)/45045;
1436 _C4x[4] = ((1088-4480*_n)*_n+156)/45045;
1437 _C4x[5] = (291-464*_n)/45045;
1438 _C4x[6] = 10/
real(9009);
1439 _C4x[7] = (_n*(_n*(_n*((-16*_n-64)*_n-624)+4576)-6864)+3003)/135135;
1440 _C4x[8] = (_n*(_n*((5952-768*_n)*_n-11648)+9152)-2574)/135135;
1441 _C4x[9] = (_n*((5792-10704*_n)*_n+1040)-1287)/135135;
1442 _C4x[10] = (_n*(3840*_n-2944)+468)/135135;
1443 _C4x[11] = (112*_n+15)/135135;
1444 _C4x[12] = 10/
real(9009);
1445 _C4x[13] = (_n*(_n*(_n*(128*_n-1440)+4160)-4576)+1716)/225225;
1446 _C4x[14] = (_n*(_n*(6784*_n-8448)+4992)-1144)/225225;
1447 _C4x[15] = (_n*(1664*_n+1856)-936)/225225;
1448 _C4x[16] = (168-1664*_n)/225225;
1449 _C4x[17] = -4/
real(25025);
1450 _C4x[18] = (_n*((3584-1792*_n)*_n-3328)+1144)/315315;
1451 _C4x[19] = ((1024-2048*_n)*_n-208)/105105;
1452 _C4x[20] = (1792*_n-680)/315315;
1453 _C4x[21] = 64/
real(315315);
1454 _C4x[22] = (_n*(3072*_n-2560)+832)/405405;
1455 _C4x[23] = (2048*_n-384)/405405;
1456 _C4x[24] = -512/
real(405405);
1457 _C4x[25] = (640-2048*_n)/495495;
1458 _C4x[26] = -256/
real(495495);
1459 _C4x[27] = 512/
real(585585);
1462 _C4x[0] = (_n*(_n*(_n*(_n*(_n*(_n*(588*_n+952)+1700)+3536)+9724)+58344)-
1463 204204)+510510)/765765;
1464 _C4x[1] = (_n*(_n*(_n*(_n*(_n*(96*_n+272)+1088)+10608)-77792)+116688)-
1466 _C4x[2] = (_n*(_n*(_n*(_n*(3232*_n+28288)-181152)+240448)-77792)-14586)/
1468 _C4x[3] = (_n*(_n*((182512-154048*_n)*_n-3808)-81328)+26741)/765765;
1469 _C4x[4] = (_n*(_n*(12480*_n-76160)+18496)+2652)/765765;
1470 _C4x[5] = (_n*(20960*_n-7888)+4947)/765765;
1471 _C4x[6] = (4192*_n+850)/765765;
1472 _C4x[7] = 193/
real(85085);
1473 _C4x[8] = (_n*(_n*(_n*(_n*((-96*_n-272)*_n-1088)-10608)+77792)-116688)+
1475 _C4x[9] = (_n*(_n*(_n*((-1344*_n-13056)*_n+101184)-198016)+155584)-43758)/
1477 _C4x[10] = (_n*(_n*(_n*(103744*_n-181968)+98464)+17680)-21879)/2297295;
1478 _C4x[11] = (_n*(_n*(52608*_n+65280)-50048)+7956)/2297295;
1479 _C4x[12] = ((1904-39840*_n)*_n+255)/2297295;
1480 _C4x[13] = (510-1472*_n)/459459;
1481 _C4x[14] = 349/
real(2297295);
1482 _C4x[15] = (_n*(_n*(_n*(_n*(160*_n+2176)-24480)+70720)-77792)+29172)/
1484 _C4x[16] = (_n*(_n*((115328-41472*_n)*_n-143616)+84864)-19448)/3828825;
1485 _C4x[17] = (_n*((28288-126528*_n)*_n+31552)-15912)/3828825;
1486 _C4x[18] = (_n*(64256*_n-28288)+2856)/3828825;
1487 _C4x[19] = (-928*_n-612)/3828825;
1488 _C4x[20] = 464/
real(1276275);
1489 _C4x[21] = (_n*(_n*(_n*(7168*_n-30464)+60928)-56576)+19448)/5360355;
1490 _C4x[22] = (_n*(_n*(35840*_n-34816)+17408)-3536)/1786785;
1491 _C4x[23] = ((30464-2560*_n)*_n-11560)/5360355;
1492 _C4x[24] = (1088-16384*_n)/5360355;
1493 _C4x[25] = -16/
real(97461);
1494 _C4x[26] = (_n*((52224-32256*_n)*_n-43520)+14144)/6891885;
1495 _C4x[27] = ((34816-77824*_n)*_n-6528)/6891885;
1496 _C4x[28] = (26624*_n-8704)/6891885;
1497 _C4x[29] = 128/
real(2297295);
1498 _C4x[30] = (_n*(45056*_n-34816)+10880)/8423415;
1499 _C4x[31] = (24576*_n-4352)/8423415;
1500 _C4x[32] = -6784/
real(8423415);
1501 _C4x[33] = (8704-28672*_n)/9954945;
1502 _C4x[34] = -1024/
real(3318315);
1503 _C4x[35] = 1024/
real(1640925);
1506 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