34 # pragma warning (disable: 4701)
37 namespace GeographicLib {
44 const Math::real Geodesic::tiny_ = sqrt(numeric_limits<real>::min());
45 const Math::real Geodesic::tol0_ = numeric_limits<real>::epsilon();
49 const Math::real Geodesic::tol1_ = 200 * tol0_;
50 const Math::real Geodesic::tol2_ = sqrt(tol0_);
52 const Math::real Geodesic::tolb_ = tol0_ * tol2_;
53 const Math::real Geodesic::xthresh_ = 1000 * tol2_;
57 , _f(f <= 1 ? f : 1/f)
60 , _ep2(_e2 /
Math::sq(_f1))
65 (_e2 > 0 ?
Math::atanh(sqrt(_e2)) : atan(sqrt(-_e2))) /
68 , _etol2(0.01 * tol2_ / max(real(0.1), sqrt(abs(_e2))))
80 Constants::WGS84_f<real>());
84 const real c[],
int n)
throw() {
92 ar = 2 * (cosx - sinx) * (cosx + sinx),
93 y0 = n & 1 ? *--c : 0, y1 = 0;
98 y1 = ar * y0 - y1 + *--c;
99 y0 = ar * y1 - y0 + *--c;
102 ? 2 * sinx * cosx * y0
112 bool arcmode, real s12_a12,
unsigned outmask,
113 real& lat2, real& lon2, real& azi2,
114 real& s12, real& m12, real& M12, real& M21,
115 real& S12)
const throw() {
118 outmask | (arcmode ? NONE : DISTANCE_IN))
120 GenPosition(arcmode, s12_a12, outmask,
121 lat2, lon2, azi2, s12, m12, M12, M21, S12);
126 real& s12, real& azi1, real& azi2,
127 real& m12, real& M12, real& M21, real& S12)
136 lon12 = AngRound(lon12);
138 int lonsign = lon12 >= 0 ? 1 : -1;
141 lat1 = AngRound(lat1);
142 lat2 = AngRound(lat2);
144 int swapp = abs(lat1) >= abs(lat2) ? 1 : -1;
150 int latsign = lat1 < 0 ? 1 : -1;
165 real phi, sbet1, cbet1, sbet2, cbet2, s12x, m12x;
167 phi = lat1 * Math::degree<real>();
169 sbet1 = _f1 * sin(phi);
170 cbet1 = lat1 == -90 ? tiny_ : cos(phi);
171 SinCosNorm(sbet1, cbet1);
173 phi = lat2 * Math::degree<real>();
175 sbet2 = _f1 * sin(phi);
176 cbet2 = abs(lat2) == 90 ? tiny_ : cos(phi);
177 SinCosNorm(sbet2, cbet2);
187 if (cbet1 < -sbet1) {
189 sbet2 = sbet2 < 0 ? sbet1 : -sbet1;
191 if (abs(sbet2) == -sbet1)
196 dn1 = sqrt(1 + _ep2 *
Math::sq(sbet1)),
197 dn2 = sqrt(1 + _ep2 *
Math::sq(sbet2));
200 lam12 = lon12 * Math::degree<real>(),
201 slam12 = abs(lon12) == 180 ? 0 : sin(lam12),
204 real a12, sig12, calp1, salp1, calp2, salp2;
206 real C1a[nC1_ + 1], C2a[nC2_ + 1], C3a[nC3_];
208 bool meridian = lat1 == -90 || slam12 == 0;
215 calp1 = clam12; salp1 = slam12;
216 calp2 = 1; salp2 = 0;
220 ssig1 = sbet1, csig1 = calp1 * cbet1,
221 ssig2 = sbet2, csig2 = calp2 * cbet2;
224 sig12 = atan2(max(csig1 * ssig2 - ssig1 * csig2,
real(0)),
225 csig1 * csig2 + ssig1 * ssig2);
228 Lengths(_n, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
229 cbet1, cbet2, s12x, m12x, dummy,
230 (outmask & GEODESICSCALE) != 0U, M12, M21, C1a, C2a);
239 if (sig12 < 1 || m12x >= 0) {
242 a12 = sig12 / Math::degree<real>();
252 (_f <= 0 || lam12 <= Math::pi<real>() - _f * Math::pi<real>())) {
255 calp1 = calp2 = 0; salp1 = salp2 = 1;
257 sig12 = omg12 = lam12 / _f1;
258 m12x = _b * sin(sig12);
259 if (outmask & GEODESICSCALE)
260 M12 = M21 = cos(sig12);
263 }
else if (!meridian) {
269 sig12 = InverseStart(sbet1, cbet1, dn1, sbet2, cbet2, dn2,
271 salp1, calp1, salp2, calp2,
276 real dnm = (dn1 + dn2) / 2;
277 s12x = sig12 * _b * dnm;
278 m12x =
Math::sq(dnm) * _b * sin(sig12 / dnm);
279 if (outmask & GEODESICSCALE)
280 M12 = M21 = cos(sig12 / dnm);
281 a12 = sig12 / Math::degree<real>();
282 omg12 = lam12 / (_f1 * dnm);
296 real ssig1, csig1, ssig2, csig2, eps;
299 real salp1a = tiny_, calp1a = 1, salp1b = tiny_, calp1b = -1;
300 for (
bool tripn =
false, tripb =
false; numit < maxit2_; ++numit) {
304 real v = Lambda12(sbet1, cbet1, dn1, sbet2, cbet2, dn2, salp1, calp1,
305 salp2, calp2, sig12, ssig1, csig1, ssig2, csig2,
306 eps, omg12, numit < maxit1_, dv, C1a, C2a, C3a)
310 if (tripb || !(abs(v) >= (tripn ? 8 : 2) * tol0_))
break;
312 if (v > 0 && (numit > maxit1_ || calp1/salp1 > calp1b/salp1b))
313 { salp1b = salp1; calp1b = calp1; }
314 else if (v < 0 && (numit > maxit1_ || calp1/salp1 < calp1a/salp1a))
315 { salp1a = salp1; calp1a = calp1; }
316 if (numit < maxit1_ && dv > 0) {
320 sdalp1 = sin(dalp1), cdalp1 = cos(dalp1),
321 nsalp1 = salp1 * cdalp1 + calp1 * sdalp1;
322 if (nsalp1 > 0 && abs(dalp1) < Math::pi<real>()) {
323 calp1 = calp1 * cdalp1 - salp1 * sdalp1;
325 SinCosNorm(salp1, calp1);
329 tripn = abs(v) <= 16 * tol0_;
341 salp1 = (salp1a + salp1b)/2;
342 calp1 = (calp1a + calp1b)/2;
343 SinCosNorm(salp1, calp1);
345 tripb = (abs(salp1a - salp1) + (calp1a - calp1) < tolb_ ||
346 abs(salp1 - salp1b) + (calp1 - calp1b) < tolb_);
350 Lengths(eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
351 cbet1, cbet2, s12x, m12x, dummy,
352 (outmask & GEODESICSCALE) != 0U, M12, M21, C1a, C2a);
356 a12 = sig12 / Math::degree<real>();
357 omg12 = lam12 - omg12;
361 if (outmask & DISTANCE)
364 if (outmask & REDUCEDLENGTH)
367 if (outmask & AREA) {
370 salp0 = salp1 * cbet1,
373 if (calp0 != 0 && salp0 != 0) {
376 ssig1 = sbet1, csig1 = calp1 * cbet1,
377 ssig2 = sbet2, csig2 = calp2 * cbet2,
379 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2),
381 A4 =
Math::sq(_a) * calp0 * salp0 * _e2;
382 SinCosNorm(ssig1, csig1);
383 SinCosNorm(ssig2, csig2);
387 B41 = SinCosSeries(
false, ssig1, csig1, C4a, nC4_),
388 B42 = SinCosSeries(
false, ssig2, csig2, C4a, nC4_);
389 S12 = A4 * (B42 - B41);
395 omg12 <
real(0.75) * Math::pi<real>() &&
396 sbet2 - sbet1 <
real(1.75)) {
401 somg12 = sin(omg12), domg12 = 1 + cos(omg12),
402 dbet1 = 1 + cbet1, dbet2 = 1 + cbet2;
403 alp12 = 2 * atan2( somg12 * ( sbet1 * dbet2 + sbet2 * dbet1 ),
404 domg12 * ( sbet1 * sbet2 + dbet1 * dbet2 ) );
408 salp12 = salp2 * calp1 - calp2 * salp1,
409 calp12 = calp2 * calp1 + salp2 * salp1;
414 if (salp12 == 0 && calp12 < 0) {
415 salp12 = tiny_ * calp1;
418 alp12 = atan2(salp12, calp12);
421 S12 *= swapp * lonsign * latsign;
430 if (outmask & GEODESICSCALE)
434 salp1 *= swapp * lonsign; calp1 *= swapp * latsign;
435 salp2 *= swapp * lonsign; calp2 *= swapp * latsign;
437 if (outmask & AZIMUTH) {
439 azi1 = 0 - atan2(-salp1, calp1) / Math::degree<real>();
440 azi2 = 0 - atan2(-salp2, calp2) / Math::degree<real>();
447 void Geodesic::Lengths(
real eps,
real sig12,
454 real C1a[],
real C2a[])
const throw() {
461 AB1 = (1 + A1m1) * (SinCosSeries(
true, ssig2, csig2, C1a, nC1_) -
462 SinCosSeries(
true, ssig1, csig1, C1a, nC1_)),
464 AB2 = (1 + A2m1) * (SinCosSeries(
true, ssig2, csig2, C2a, nC2_) -
465 SinCosSeries(
true, ssig1, csig1, C2a, nC2_));
467 real J12 = m0 * sig12 + (AB1 - AB2);
471 m12b = dn2 * (csig1 * ssig2) - dn1 * (ssig1 * csig2) - csig1 * csig2 * J12;
473 s12b = (1 + A1m1) * sig12 + AB1;
475 real csig12 = csig1 * csig2 + ssig1 * ssig2;
476 real t = _ep2 * (cbet1 - cbet2) * (cbet1 + cbet2) / (dn1 + dn2);
477 M12 = csig12 + (t * ssig2 - csig2 * J12) * ssig1 / dn1;
478 M21 = csig12 - (t * ssig1 - csig1 * J12) * ssig2 / dn2;
490 if ( !(q == 0 && r <= 0) ) {
499 disc = S * (S + 2 * r3);
506 T3 += T3 < 0 ? -sqrt(disc) : sqrt(disc);
510 u += T + (T != 0 ? r2 / T : 0);
513 real ang = atan2(sqrt(-disc), -(S + r3));
516 u += 2 * r * cos(ang / 3);
521 uv = u < 0 ? q / (v - u) : u + v,
522 w = (uv - q) / (2 * v);
525 k = uv / (sqrt(uv +
Math::sq(w)) + w);
541 real C1a[],
real C2a[])
const throw() {
548 sbet12 = sbet2 * cbet1 - cbet2 * sbet1,
549 cbet12 = cbet2 * cbet1 + sbet2 * sbet1;
550 #if defined(__GNUC__) && __GNUC__ == 4 && \
551 (__GNUC_MINOR__ < 6 || defined(__MINGW32__))
560 volatile real xx1 = sbet2 * cbet1;
561 volatile real xx2 = cbet2 * sbet1;
565 real sbet12a = sbet2 * cbet1 + cbet2 * sbet1;
567 bool shortline = cbet12 >= 0 && sbet12 <
real(0.5) &&
568 lam12 <= Math::pi<real>() / 6;
570 omg12 = !shortline ? lam12 : lam12 / (_f1 * (dn1 + dn2) / 2),
571 somg12 = sin(omg12), comg12 = cos(omg12);
573 salp1 = cbet2 * somg12;
574 calp1 = comg12 >= 0 ?
575 sbet12 + cbet2 * sbet1 *
Math::sq(somg12) / (1 + comg12) :
576 sbet12a - cbet2 * sbet1 *
Math::sq(somg12) / (1 - comg12);
580 csig12 = sbet1 * sbet2 + cbet1 * cbet2 * comg12;
582 if (shortline && ssig12 < _etol2) {
584 salp2 = cbet1 * somg12;
585 calp2 = sbet12 - cbet1 * sbet2 *
Math::sq(somg12) / (1 + comg12);
586 SinCosNorm(salp2, calp2);
588 sig12 = atan2(ssig12, csig12);
589 }
else if (abs(_n) >
real(0.1) ||
591 ssig12 >= 6 * abs(_n) * Math::pi<real>() *
Math::sq(cbet1)) {
596 real y, lamscale, betscale;
606 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2);
607 lamscale = _f * cbet1 * A3f(eps) * Math::pi<real>();
609 betscale = lamscale * cbet1;
611 x = (lam12 - Math::pi<real>()) / lamscale;
612 y = sbet12a / betscale;
616 cbet12a = cbet2 * cbet1 - sbet2 * sbet1,
617 bet12a = atan2(sbet12a, cbet12a);
618 real m12b, m0, dummy;
621 Lengths(_n, Math::pi<real>() + bet12a,
622 sbet1, -cbet1, dn1, sbet2, cbet2, dn2,
623 cbet1, cbet2, dummy, m12b, m0,
false,
624 dummy, dummy, C1a, C2a);
625 x = -1 + m12b / (cbet1 * cbet2 * m0 * Math::pi<real>());
626 betscale = x < -
real(0.01) ? sbet12a / x :
627 -_f *
Math::sq(cbet1) * Math::pi<real>();
628 lamscale = betscale / cbet1;
629 y = (lam12 - Math::pi<real>()) / lamscale;
632 if (y > -tol1_ && x > -1 - xthresh_) {
638 calp1 = max(
real(x > -tol1_ ? 0 : -1),
real(x));
676 real k = Astroid(x, y);
678 omg12a = lamscale * ( _f >= 0 ? -x * k/(1 + k) : -y * (1 + k)/k );
679 somg12 = sin(omg12a); comg12 = -cos(omg12a);
681 salp1 = cbet2 * somg12;
682 calp1 = sbet12a - cbet2 * sbet1 *
Math::sq(somg12) / (1 - comg12);
686 SinCosNorm(salp1, calp1);
688 salp1 = 1; calp1 = 0;
701 bool diffp,
real& dlam12,
706 if (sbet1 == 0 && calp1 == 0)
713 salp0 = salp1 * cbet1,
716 real somg1, comg1, somg2, comg2, omg12, lam12;
719 ssig1 = sbet1; somg1 = salp0 * sbet1;
720 csig1 = comg1 = calp1 * cbet1;
721 SinCosNorm(ssig1, csig1);
728 salp2 = cbet2 != cbet1 ? salp0 / cbet2 : salp1;
733 calp2 = cbet2 != cbet1 || abs(sbet2) != -sbet1 ?
736 (cbet2 - cbet1) * (cbet1 + cbet2) :
737 (sbet1 - sbet2) * (sbet1 + sbet2))) / cbet2 :
741 ssig2 = sbet2; somg2 = salp0 * sbet2;
742 csig2 = comg2 = calp2 * cbet2;
743 SinCosNorm(ssig2, csig2);
747 sig12 = atan2(max(csig1 * ssig2 - ssig1 * csig2,
real(0)),
748 csig1 * csig2 + ssig1 * ssig2);
751 omg12 = atan2(max(comg1 * somg2 - somg1 * comg2,
real(0)),
752 comg1 * comg2 + somg1 * somg2);
755 eps = k2 / (2 * (1 + sqrt(1 + k2)) + k2);
757 B312 = (SinCosSeries(
true, ssig2, csig2, C3a, nC3_-1) -
758 SinCosSeries(
true, ssig1, csig1, C3a, nC3_-1));
760 domg12 = salp0 * h0 * (sig12 + B312);
761 lam12 = omg12 + domg12;
765 dlam12 = - 2 * _f1 * dn1 / sbet1;
768 Lengths(eps, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
769 cbet1, cbet2, dummy, dlam12, dummy,
770 false, dummy, dummy, C1a, C2a);
771 dlam12 *= _f1 / (calp2 * cbet2);
781 for (
int i = nA3x_; i; )
782 v = eps * v + _A3x[--i];
786 void Geodesic::C3f(
real eps,
real c[])
const throw() {
789 for (
int j = nC3x_, k = nC3_ - 1; k; ) {
791 for (
int i = nC3_ - k; i; --i)
792 t = eps * t + _C3x[--j];
797 for (
int k = 1; k < nC3_; ) {
803 void Geodesic::C4f(
real eps,
real c[])
const throw() {
806 for (
int j = nC4x_, k = nC4_; k; ) {
808 for (
int i = nC4_ - k + 1; i; --i)
809 t = eps * t + _C4x[--j];
814 for (
int k = 1; k < nC4_; ) {
835 t = eps2*(eps2+16)/64;
838 t = eps2*(eps2*(eps2+4)+64)/256;
841 t = eps2*(eps2*(eps2*(25*eps2+64)+256)+4096)/16384;
847 return (t + eps) / (1 - eps);
851 void Geodesic::C1f(
real eps,
real c[])
throw() {
867 c[1] = d*(3*eps2-8)/16;
874 c[1] = d*(3*eps2-8)/16;
876 c[2] = d*(eps2-2)/32;
883 c[1] = d*((6-eps2)*eps2-16)/32;
885 c[2] = d*(eps2-2)/32;
887 c[3] = d*(9*eps2-16)/768;
894 c[1] = d*((6-eps2)*eps2-16)/32;
896 c[2] = d*((64-9*eps2)*eps2-128)/2048;
898 c[3] = d*(9*eps2-16)/768;
900 c[4] = d*(3*eps2-5)/512;
907 c[1] = d*(eps2*(eps2*(19*eps2-64)+384)-1024)/2048;
909 c[2] = d*((64-9*eps2)*eps2-128)/2048;
911 c[3] = d*((72-9*eps2)*eps2-128)/6144;
913 c[4] = d*(3*eps2-5)/512;
915 c[5] = d*(35*eps2-56)/10240;
922 c[1] = d*(eps2*(eps2*(19*eps2-64)+384)-1024)/2048;
924 c[2] = d*(eps2*(eps2*(7*eps2-18)+128)-256)/4096;
926 c[3] = d*((72-9*eps2)*eps2-128)/6144;
928 c[4] = d*((96-11*eps2)*eps2-160)/16384;
930 c[5] = d*(35*eps2-56)/10240;
932 c[6] = d*(9*eps2-14)/4096;
936 c[8] = -429*d/262144;
944 void Geodesic::C1pf(
real eps,
real c[])
throw() {
960 c[1] = d*(16-9*eps2)/32;
967 c[1] = d*(16-9*eps2)/32;
969 c[2] = d*(30-37*eps2)/96;
976 c[1] = d*(eps2*(205*eps2-432)+768)/1536;
978 c[2] = d*(30-37*eps2)/96;
980 c[3] = d*(116-225*eps2)/384;
987 c[1] = d*(eps2*(205*eps2-432)+768)/1536;
989 c[2] = d*(eps2*(4005*eps2-4736)+3840)/12288;
991 c[3] = d*(116-225*eps2)/384;
993 c[4] = d*(2695-7173*eps2)/7680;
997 c[6] = 38081*d/61440;
1000 c[1] = d*(eps2*((9840-4879*eps2)*eps2-20736)+36864)/73728;
1002 c[2] = d*(eps2*(4005*eps2-4736)+3840)/12288;
1004 c[3] = d*(eps2*(8703*eps2-7200)+3712)/12288;
1006 c[4] = d*(2695-7173*eps2)/7680;
1008 c[5] = d*(41604-141115*eps2)/92160;
1010 c[6] = 38081*d/61440;
1012 c[7] = 459485*d/516096;
1015 c[1] = d*(eps2*((9840-4879*eps2)*eps2-20736)+36864)/73728;
1017 c[2] = d*(eps2*((120150-86171*eps2)*eps2-142080)+115200)/368640;
1019 c[3] = d*(eps2*(8703*eps2-7200)+3712)/12288;
1021 c[4] = d*(eps2*(1082857*eps2-688608)+258720)/737280;
1023 c[5] = d*(41604-141115*eps2)/92160;
1025 c[6] = d*(533134-2200311*eps2)/860160;
1027 c[7] = 459485*d/516096;
1029 c[8] = 109167851*d/82575360;
1032 STATIC_ASSERT(nC1p_ >= 0 && nC1p_ <= 8,
"Bad value of nC1p_");
1049 t = eps2*(9*eps2+16)/64;
1052 t = eps2*(eps2*(25*eps2+36)+64)/256;
1055 t = eps2*(eps2*(eps2*(1225*eps2+1600)+2304)+4096)/16384;
1061 return t * (1 - eps) - eps;
1065 void Geodesic::C2f(
real eps,
real c[])
throw() {
1081 c[1] = d*(eps2+8)/16;
1088 c[1] = d*(eps2+8)/16;
1090 c[2] = d*(eps2+6)/32;
1097 c[1] = d*(eps2*(eps2+2)+16)/32;
1099 c[2] = d*(eps2+6)/32;
1101 c[3] = d*(15*eps2+80)/768;
1108 c[1] = d*(eps2*(eps2+2)+16)/32;
1110 c[2] = d*(eps2*(35*eps2+64)+384)/2048;
1112 c[3] = d*(15*eps2+80)/768;
1114 c[4] = d*(7*eps2+35)/512;
1121 c[1] = d*(eps2*(eps2*(41*eps2+64)+128)+1024)/2048;
1123 c[2] = d*(eps2*(35*eps2+64)+384)/2048;
1125 c[3] = d*(eps2*(69*eps2+120)+640)/6144;
1127 c[4] = d*(7*eps2+35)/512;
1129 c[5] = d*(105*eps2+504)/10240;
1136 c[1] = d*(eps2*(eps2*(41*eps2+64)+128)+1024)/2048;
1138 c[2] = d*(eps2*(eps2*(47*eps2+70)+128)+768)/4096;
1140 c[3] = d*(eps2*(69*eps2+120)+640)/6144;
1142 c[4] = d*(eps2*(133*eps2+224)+1120)/16384;
1144 c[5] = d*(105*eps2+504)/10240;
1146 c[6] = d*(33*eps2+154)/4096;
1150 c[8] = 6435*d/262144;
1158 void Geodesic::A3coeff() throw() {
1167 _A3x[1] = -1/
real(2);
1172 _A3x[2] = -1/
real(4);
1177 _A3x[2] = (-_n-2)/8;
1178 _A3x[3] = -1/
real(16);
1183 _A3x[2] = (_n*(3*_n-1)-2)/8;
1184 _A3x[3] = (-3*_n-1)/16;
1185 _A3x[4] = -3/
real(64);
1190 _A3x[2] = (_n*(3*_n-1)-2)/8;
1191 _A3x[3] = ((-_n-3)*_n-1)/16;
1192 _A3x[4] = (-2*_n-3)/64;
1193 _A3x[5] = -3/
real(128);
1198 _A3x[2] = (_n*(3*_n-1)-2)/8;
1199 _A3x[3] = (_n*(_n*(5*_n-1)-3)-1)/16;
1200 _A3x[4] = ((-10*_n-2)*_n-3)/64;
1201 _A3x[5] = (-5*_n-3)/128;
1202 _A3x[6] = -5/
real(256);
1207 _A3x[2] = (_n*(3*_n-1)-2)/8;
1208 _A3x[3] = (_n*(_n*(5*_n-1)-3)-1)/16;
1209 _A3x[4] = (_n*((-5*_n-20)*_n-4)-6)/128;
1210 _A3x[5] = ((-5*_n-10)*_n-6)/256;
1211 _A3x[6] = (-15*_n-20)/1024;
1212 _A3x[7] = -25/
real(2048);
1220 void Geodesic::C3coeff() throw() {
1227 _C3x[0] = 1/
real(4);
1231 _C3x[1] = 1/
real(8);
1232 _C3x[2] = 1/
real(16);
1236 _C3x[1] = 1/
real(8);
1237 _C3x[2] = 3/
real(64);
1238 _C3x[3] = (2-3*_n)/32;
1239 _C3x[4] = 3/
real(64);
1240 _C3x[5] = 5/
real(192);
1244 _C3x[1] = (1-_n*_n)/8;
1245 _C3x[2] = (3*_n+3)/64;
1246 _C3x[3] = 5/
real(128);
1247 _C3x[4] = ((_n-3)*_n+2)/32;
1248 _C3x[5] = (3-2*_n)/64;
1249 _C3x[6] = 3/
real(128);
1250 _C3x[7] = (5-9*_n)/192;
1251 _C3x[8] = 3/
real(128);
1252 _C3x[9] = 7/
real(512);
1256 _C3x[1] = (1-_n*_n)/8;
1257 _C3x[2] = ((3-_n)*_n+3)/64;
1258 _C3x[3] = (2*_n+5)/128;
1259 _C3x[4] = 3/
real(128);
1260 _C3x[5] = ((_n-3)*_n+2)/32;
1261 _C3x[6] = ((-3*_n-2)*_n+3)/64;
1262 _C3x[7] = (_n+3)/128;
1263 _C3x[8] = 5/
real(256);
1264 _C3x[9] = (_n*(5*_n-9)+5)/192;
1265 _C3x[10] = (9-10*_n)/384;
1266 _C3x[11] = 7/
real(512);
1267 _C3x[12] = (7-14*_n)/512;
1268 _C3x[13] = 7/
real(512);
1269 _C3x[14] = 21/
real(2560);
1273 _C3x[1] = (1-_n*_n)/8;
1274 _C3x[2] = (_n*((-5*_n-1)*_n+3)+3)/64;
1275 _C3x[3] = (_n*(2*_n+2)+5)/128;
1276 _C3x[4] = (11*_n+12)/512;
1277 _C3x[5] = 21/
real(1024);
1278 _C3x[6] = ((_n-3)*_n+2)/32;
1279 _C3x[7] = (_n*(_n*(2*_n-3)-2)+3)/64;
1280 _C3x[8] = ((2-9*_n)*_n+6)/256;
1281 _C3x[9] = (_n+5)/256;
1282 _C3x[10] = 27/
real(2048);
1283 _C3x[11] = (_n*((5-_n)*_n-9)+5)/192;
1284 _C3x[12] = ((-6*_n-10)*_n+9)/384;
1285 _C3x[13] = (21-4*_n)/1536;
1286 _C3x[14] = 3/
real(256);
1287 _C3x[15] = (_n*(10*_n-14)+7)/512;
1288 _C3x[16] = (7-10*_n)/512;
1289 _C3x[17] = 9/
real(1024);
1290 _C3x[18] = (21-45*_n)/2560;
1291 _C3x[19] = 9/
real(1024);
1292 _C3x[20] = 11/
real(2048);
1296 _C3x[1] = (1-_n*_n)/8;
1297 _C3x[2] = (_n*((-5*_n-1)*_n+3)+3)/64;
1298 _C3x[3] = (_n*((2-2*_n)*_n+2)+5)/128;
1299 _C3x[4] = (_n*(3*_n+11)+12)/512;
1300 _C3x[5] = (10*_n+21)/1024;
1301 _C3x[6] = 243/
real(16384);
1302 _C3x[7] = ((_n-3)*_n+2)/32;
1303 _C3x[8] = (_n*(_n*(2*_n-3)-2)+3)/64;
1304 _C3x[9] = (_n*((-6*_n-9)*_n+2)+6)/256;
1305 _C3x[10] = ((1-2*_n)*_n+5)/256;
1306 _C3x[11] = (69*_n+108)/8192;
1307 _C3x[12] = 187/
real(16384);
1308 _C3x[13] = (_n*((5-_n)*_n-9)+5)/192;
1309 _C3x[14] = (_n*(_n*(10*_n-6)-10)+9)/384;
1310 _C3x[15] = ((-77*_n-8)*_n+42)/3072;
1311 _C3x[16] = (12-_n)/1024;
1312 _C3x[17] = 139/
real(16384);
1313 _C3x[18] = (_n*((20-7*_n)*_n-28)+14)/1024;
1314 _C3x[19] = ((-7*_n-40)*_n+28)/2048;
1315 _C3x[20] = (72-43*_n)/8192;
1316 _C3x[21] = 127/
real(16384);
1317 _C3x[22] = (_n*(75*_n-90)+42)/5120;
1318 _C3x[23] = (9-15*_n)/1024;
1319 _C3x[24] = 99/
real(16384);
1320 _C3x[25] = (44-99*_n)/8192;
1321 _C3x[26] = 99/
real(16384);
1322 _C3x[27] = 429/
real(114688);
1332 void Geodesic::C4coeff() throw() {
1337 _C4x[0] = 2/
real(3);
1340 _C4x[0] = (10-4*_n)/15;
1341 _C4x[1] = -1/
real(5);
1342 _C4x[2] = 1/
real(45);
1345 _C4x[0] = (_n*(8*_n-28)+70)/105;
1346 _C4x[1] = (16*_n-7)/35;
1347 _C4x[2] = -2/
real(105);
1348 _C4x[3] = (7-16*_n)/315;
1349 _C4x[4] = -2/
real(105);
1350 _C4x[5] = 4/
real(525);
1353 _C4x[0] = (_n*(_n*(4*_n+24)-84)+210)/315;
1354 _C4x[1] = ((48-32*_n)*_n-21)/105;
1355 _C4x[2] = (-32*_n-6)/315;
1356 _C4x[3] = 11/
real(315);
1357 _C4x[4] = (_n*(32*_n-48)+21)/945;
1358 _C4x[5] = (64*_n-18)/945;
1359 _C4x[6] = -1/
real(105);
1360 _C4x[7] = (12-32*_n)/1575;
1361 _C4x[8] = -8/
real(1575);
1362 _C4x[9] = 8/
real(2205);
1365 _C4x[0] = (_n*(_n*(_n*(16*_n+44)+264)-924)+2310)/3465;
1366 _C4x[1] = (_n*(_n*(48*_n-352)+528)-231)/1155;
1367 _C4x[2] = (_n*(1088*_n-352)-66)/3465;
1368 _C4x[3] = (121-368*_n)/3465;
1369 _C4x[4] = 4/
real(1155);
1370 _C4x[5] = (_n*((352-48*_n)*_n-528)+231)/10395;
1371 _C4x[6] = ((704-896*_n)*_n-198)/10395;
1372 _C4x[7] = (80*_n-99)/10395;
1373 _C4x[8] = 4/
real(1155);
1374 _C4x[9] = (_n*(320*_n-352)+132)/17325;
1375 _C4x[10] = (384*_n-88)/17325;
1376 _C4x[11] = -8/
real(1925);
1377 _C4x[12] = (88-256*_n)/24255;
1378 _C4x[13] = -16/
real(8085);
1379 _C4x[14] = 64/
real(31185);
1382 _C4x[0] = (_n*(_n*(_n*(_n*(100*_n+208)+572)+3432)-12012)+30030)/45045;
1383 _C4x[1] = (_n*(_n*(_n*(64*_n+624)-4576)+6864)-3003)/15015;
1384 _C4x[2] = (_n*((14144-10656*_n)*_n-4576)-858)/45045;
1385 _C4x[3] = ((-224*_n-4784)*_n+1573)/45045;
1386 _C4x[4] = (1088*_n+156)/45045;
1387 _C4x[5] = 97/
real(15015);
1388 _C4x[6] = (_n*(_n*((-64*_n-624)*_n+4576)-6864)+3003)/135135;
1389 _C4x[7] = (_n*(_n*(5952*_n-11648)+9152)-2574)/135135;
1390 _C4x[8] = (_n*(5792*_n+1040)-1287)/135135;
1391 _C4x[9] = (468-2944*_n)/135135;
1392 _C4x[10] = 1/
real(9009);
1393 _C4x[11] = (_n*((4160-1440*_n)*_n-4576)+1716)/225225;
1394 _C4x[12] = ((4992-8448*_n)*_n-1144)/225225;
1395 _C4x[13] = (1856*_n-936)/225225;
1396 _C4x[14] = 8/
real(10725);
1397 _C4x[15] = (_n*(3584*_n-3328)+1144)/315315;
1398 _C4x[16] = (1024*_n-208)/105105;
1399 _C4x[17] = -136/
real(63063);
1400 _C4x[18] = (832-2560*_n)/405405;
1401 _C4x[19] = -128/
real(135135);
1402 _C4x[20] = 128/
real(99099);
1405 _C4x[0] = (_n*(_n*(_n*(_n*(_n*(56*_n+100)+208)+572)+3432)-12012)+30030)/
1407 _C4x[1] = (_n*(_n*(_n*(_n*(16*_n+64)+624)-4576)+6864)-3003)/15015;
1408 _C4x[2] = (_n*(_n*(_n*(1664*_n-10656)+14144)-4576)-858)/45045;
1409 _C4x[3] = (_n*(_n*(10736*_n-224)-4784)+1573)/45045;
1410 _C4x[4] = ((1088-4480*_n)*_n+156)/45045;
1411 _C4x[5] = (291-464*_n)/45045;
1412 _C4x[6] = 10/
real(9009);
1413 _C4x[7] = (_n*(_n*(_n*((-16*_n-64)*_n-624)+4576)-6864)+3003)/135135;
1414 _C4x[8] = (_n*(_n*((5952-768*_n)*_n-11648)+9152)-2574)/135135;
1415 _C4x[9] = (_n*((5792-10704*_n)*_n+1040)-1287)/135135;
1416 _C4x[10] = (_n*(3840*_n-2944)+468)/135135;
1417 _C4x[11] = (112*_n+15)/135135;
1418 _C4x[12] = 10/
real(9009);
1419 _C4x[13] = (_n*(_n*(_n*(128*_n-1440)+4160)-4576)+1716)/225225;
1420 _C4x[14] = (_n*(_n*(6784*_n-8448)+4992)-1144)/225225;
1421 _C4x[15] = (_n*(1664*_n+1856)-936)/225225;
1422 _C4x[16] = (168-1664*_n)/225225;
1423 _C4x[17] = -4/
real(25025);
1424 _C4x[18] = (_n*((3584-1792*_n)*_n-3328)+1144)/315315;
1425 _C4x[19] = ((1024-2048*_n)*_n-208)/105105;
1426 _C4x[20] = (1792*_n-680)/315315;
1427 _C4x[21] = 64/
real(315315);
1428 _C4x[22] = (_n*(3072*_n-2560)+832)/405405;
1429 _C4x[23] = (2048*_n-384)/405405;
1430 _C4x[24] = -512/
real(405405);
1431 _C4x[25] = (640-2048*_n)/495495;
1432 _C4x[26] = -256/
real(495495);
1433 _C4x[27] = 512/
real(585585);
1436 _C4x[0] = (_n*(_n*(_n*(_n*(_n*(_n*(588*_n+952)+1700)+3536)+9724)+58344)-
1437 204204)+510510)/765765;
1438 _C4x[1] = (_n*(_n*(_n*(_n*(_n*(96*_n+272)+1088)+10608)-77792)+116688)-
1440 _C4x[2] = (_n*(_n*(_n*(_n*(3232*_n+28288)-181152)+240448)-77792)-14586)/
1442 _C4x[3] = (_n*(_n*((182512-154048*_n)*_n-3808)-81328)+26741)/765765;
1443 _C4x[4] = (_n*(_n*(12480*_n-76160)+18496)+2652)/765765;
1444 _C4x[5] = (_n*(20960*_n-7888)+4947)/765765;
1445 _C4x[6] = (4192*_n+850)/765765;
1446 _C4x[7] = 193/
real(85085);
1447 _C4x[8] = (_n*(_n*(_n*(_n*((-96*_n-272)*_n-1088)-10608)+77792)-116688)+
1449 _C4x[9] = (_n*(_n*(_n*((-1344*_n-13056)*_n+101184)-198016)+155584)-43758)/
1451 _C4x[10] = (_n*(_n*(_n*(103744*_n-181968)+98464)+17680)-21879)/2297295;
1452 _C4x[11] = (_n*(_n*(52608*_n+65280)-50048)+7956)/2297295;
1453 _C4x[12] = ((1904-39840*_n)*_n+255)/2297295;
1454 _C4x[13] = (510-1472*_n)/459459;
1455 _C4x[14] = 349/
real(2297295);
1456 _C4x[15] = (_n*(_n*(_n*(_n*(160*_n+2176)-24480)+70720)-77792)+29172)/
1458 _C4x[16] = (_n*(_n*((115328-41472*_n)*_n-143616)+84864)-19448)/3828825;
1459 _C4x[17] = (_n*((28288-126528*_n)*_n+31552)-15912)/3828825;
1460 _C4x[18] = (_n*(64256*_n-28288)+2856)/3828825;
1461 _C4x[19] = (-928*_n-612)/3828825;
1462 _C4x[20] = 464/
real(1276275);
1463 _C4x[21] = (_n*(_n*(_n*(7168*_n-30464)+60928)-56576)+19448)/5360355;
1464 _C4x[22] = (_n*(_n*(35840*_n-34816)+17408)-3536)/1786785;
1465 _C4x[23] = ((30464-2560*_n)*_n-11560)/5360355;
1466 _C4x[24] = (1088-16384*_n)/5360355;
1467 _C4x[25] = -16/
real(97461);
1468 _C4x[26] = (_n*((52224-32256*_n)*_n-43520)+14144)/6891885;
1469 _C4x[27] = ((34816-77824*_n)*_n-6528)/6891885;
1470 _C4x[28] = (26624*_n-8704)/6891885;
1471 _C4x[29] = 128/
real(2297295);
1472 _C4x[30] = (_n*(45056*_n-34816)+10880)/8423415;
1473 _C4x[31] = (24576*_n-4352)/8423415;
1474 _C4x[32] = -6784/
real(8423415);
1475 _C4x[33] = (8704-28672*_n)/9954945;
1476 _C4x[34] = -1024/
real(3318315);
1477 _C4x[35] = 1024/
real(1640925);