14 # pragma warning (disable: 4127)
31 static const real tolRF =
32 pow(3 * numeric_limits<real>::epsilon() *
real(0.01), 1/
real(8));
36 Q = fmax(fmax(fabs(A0-x), fabs(A0-y)), fabs(A0-z)) / tolRF,
41 while (Q >= mul * fabs(An)) {
43 real lam = sqrt(x0)*sqrt(y0) + sqrt(y0)*sqrt(z0) + sqrt(z0)*sqrt(x0);
51 X = (A0 - x) / (mul * An),
52 Y = (A0 - y) / (mul * An),
61 return (E3 * (6930 * E3 + E2 * (15015 * E2 - 16380) + 17160) +
62 E2 * ((10010 - 5775 * E2) * E2 - 24024) + 240240) /
68 static const real tolRG0 =
69 real(2.7) * sqrt((numeric_limits<real>::epsilon() *
real(0.01)));
70 real xn = sqrt(x), yn = sqrt(y);
71 if (xn < yn)
swap(xn, yn);
72 while (fabs(xn-yn) > tolRG0 * xn) {
74 real t = (xn + yn) /2;
85 atan(sqrt((y - x) / x)) / sqrt(y - x) :
86 ( x == y ? 1 / sqrt(y) :
93 sqrt(-x / y) ) / sqrt(x - y) ) );
100 return (z * RF(x, y, z) - (x-z) * (y-z) * RD(x, y, z) / 3
101 + sqrt(x * y / z)) / 2;
106 static const real tolRG0 =
107 real(2.7) * sqrt((numeric_limits<real>::epsilon() *
real(0.01)));
109 x0 = sqrt(fmax(x, y)),
110 y0 = sqrt(fmin(x, y)),
115 while (fabs(xn-yn) > tolRG0 * xn) {
117 real t = (xn + yn) /2;
130 tolRD = pow(
real(0.2) * (numeric_limits<real>::epsilon() *
real(0.01)),
133 A0 = (x + y + z + 2*p)/5,
135 delta = (p-x) * (p-y) * (p-z),
136 Q = fmax(fmax(fabs(A0-x), fabs(A0-y)),
137 fmax(fabs(A0-z), fabs(A0-p))) / tolRD,
145 while (Q >= mul * fabs(An)) {
148 lam = sqrt(x0)*sqrt(y0) + sqrt(y0)*sqrt(z0) + sqrt(z0)*sqrt(x0),
149 d0 = (sqrt(p0)+sqrt(x0)) * (sqrt(p0)+sqrt(y0)) * (sqrt(p0)+sqrt(z0)),
151 s += RC(1, 1 + e0)/(mul * d0);
161 X = (A0 - x) / (mul * An),
162 Y = (A0 - y) / (mul * An),
163 Z = (A0 - z) / (mul * An),
164 P = -(X + Y + Z) / 2,
165 E2 = X*Y + X*Z + Y*Z - 3*P*P,
166 E3 = X*Y*Z + 2*P * (E2 + 2*P*P),
167 E4 = (2*X*Y*Z + P * (E2 + 3*P*P)) * P,
174 return ((471240 - 540540 * E2) * E5 +
175 (612612 * E2 - 540540 * E3 - 556920) * E4 +
176 E3 * (306306 * E3 + E2 * (675675 * E2 - 706860) + 680680) +
177 E2 * ((417690 - 255255 * E2) * E2 - 875160) + 4084080) /
178 (4084080 * mul * An * sqrt(An)) + 6 * s;
184 tolRD = pow(
real(0.2) * (numeric_limits<real>::epsilon() *
real(0.01)),
187 A0 = (x + y + 3*z)/5,
189 Q = fmax(fmax(fabs(A0-x), fabs(A0-y)), fabs(A0-z)) / tolRD,
195 while (Q >= mul * fabs(An)) {
197 real lam = sqrt(x0)*sqrt(y0) + sqrt(y0)*sqrt(z0) + sqrt(z0)*sqrt(x0);
198 s += 1/(mul * sqrt(z0) * (z0 + lam));
206 X = (A0 - x) / (mul * An),
207 Y = (A0 - y) / (mul * An),
210 E3 = (3*X*Y - 8*Z*Z)*Z,
211 E4 = 3 * (X*Y - Z*Z) * Z*Z,
218 return ((471240 - 540540 * E2) * E5 +
219 (612612 * E2 - 540540 * E3 - 556920) * E4 +
220 E3 * (306306 * E3 + E2 * (675675 * E2 - 706860) + 680680) +
221 E2 * ((417690 - 255255 * E2) * E2 - 875160) + 4084080) /
222 (4084080 * mul * An * sqrt(An)) + 3 * s;
226 real kp2, real alphap2) {
240 _eps = _k2/
Math::sq(sqrt(_kp2) + 1);
269 _eEc = _kp2 != 0 ? 2 * RG(_kp2, 1) : 1;
274 _kKc = _eEc =
Math::pi()/2; _dDc = _kKc/2;
278 real rj = (_kp2 != 0 && _alphap2 != 0) ? RJ(0, _kp2, 1, _alphap2) :
286 _gGc = _kp2 != 0 ? _kKc + (_alpha2 - _k2) * rj / 3 : rc;
288 _hHc = _kp2 != 0 ? _kKc - (_alphap2 != 0 ? _alphap2 * rj : 0) / 3 : rc;
290 _pPic = _kKc; _gGc = _eEc;
304 _hHc = _kp2 != 0 ? _kp2 * RD(0, 1, _kp2) / 3 : 1;
318 static const real tolJAC =
319 sqrt(numeric_limits<real>::epsilon() *
real(0.01));
321 real mc = _kp2, d = 0;
329 real m[num_], n[num_];
334 n[l] = mc = sqrt(mc);
336 if (!(fabs(a - mc) > tolJAC * a)) {
354 dn = (n[l] + a) / (b + a);
357 a = 1 / sqrt(c*c + 1);
358 sn = signbit(sn) ? -a : a;
367 dn = cn = 1 / cosh(x);
374 real cn2 = cn*cn, dn2 = dn*dn,
375 fi = cn2 != 0 ? fabs(sn) * RF(cn2, dn2, 1) : K();
379 return copysign(fi, sn);
384 cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn,
386 fabs(sn) * ( _k2 <= 0 ?
389 RF(cn2, dn2, 1) - _k2 * sn2 * RD(cn2, dn2, 1) / 3 :
392 _kp2 * RF(cn2, dn2, 1) +
393 _k2 * _kp2 * sn2 * RD(cn2, 1, dn2) / 3 +
394 _k2 * fabs(cn) / dn :
396 - _kp2 * sn2 * RD(dn2, 1, cn2) / 3 +
402 return copysign(ei, sn);
409 cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn,
410 di = cn2 != 0 ? fabs(sn) * sn2 * RD(cn2, dn2, 1) / 3 : D();
414 return copysign(di, sn);
421 cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn,
422 pii = cn2 != 0 ? fabs(sn) * (RF(cn2, dn2, 1) +
424 RJ(cn2, dn2, 1, cn2 + _alphap2 * sn2) / 3) :
428 pii = 2 * Pi() - pii;
429 return copysign(pii, sn);
434 cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn,
435 gi = cn2 != 0 ? fabs(sn) * (RF(cn2, dn2, 1) +
436 (_alpha2 - _k2) * sn2 *
437 RJ(cn2, dn2, 1, cn2 + _alphap2 * sn2) / 3) :
442 return copysign(gi, sn);
447 cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn,
449 hi = cn2 != 0 ? fabs(sn) * (RF(cn2, dn2, 1) -
451 RJ(cn2, dn2, 1, cn2 + _alphap2 * sn2) / 3) :
456 return copysign(hi, sn);
461 if (signbit(cn)) { cn = -cn; sn = -sn; }
462 return F(sn, cn, dn) * (
Math::pi()/2) / K() - atan2(sn, cn);
467 if (signbit(cn)) { cn = -cn; sn = -sn; }
468 return E(sn, cn, dn) * (
Math::pi()/2) / E() - atan2(sn, cn);
473 if (signbit(cn)) { cn = -cn; sn = -sn; }
474 return Pi(sn, cn, dn) * (
Math::pi()/2) / Pi() - atan2(sn, cn);
479 if (signbit(cn)) { cn = -cn; sn = -sn; }
480 return D(sn, cn, dn) * (
Math::pi()/2) / D() - atan2(sn, cn);
485 if (signbit(cn)) { cn = -cn; sn = -sn; }
486 return G(sn, cn, dn) * (
Math::pi()/2) / G() - atan2(sn, cn);
491 if (signbit(cn)) { cn = -cn; sn = -sn; }
492 return H(sn, cn, dn) * (
Math::pi()/2) / H() - atan2(sn, cn);
496 real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn);
497 return fabs(phi) <
Math::pi() ? F(sn, cn, dn) :
498 (deltaF(sn, cn, dn) + phi) * K() / (
Math::pi()/2);
502 real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn);
503 return fabs(phi) <
Math::pi() ? E(sn, cn, dn) :
504 (deltaE(sn, cn, dn) + phi) * E() / (
Math::pi()/2);
512 return E(sn, cn, Delta(sn, cn)) + 4 * E() * n;
516 real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn);
517 return fabs(phi) <
Math::pi() ? Pi(sn, cn, dn) :
518 (deltaPi(sn, cn, dn) + phi) * Pi() / (
Math::pi()/2);
522 real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn);
523 return fabs(phi) <
Math::pi() ? D(sn, cn, dn) :
524 (deltaD(sn, cn, dn) + phi) * D() / (
Math::pi()/2);
528 real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn);
529 return fabs(phi) <
Math::pi() ? G(sn, cn, dn) :
530 (deltaG(sn, cn, dn) + phi) * G() / (
Math::pi()/2);
534 real sn = sin(phi), cn = cos(phi), dn = Delta(sn, cn);
535 return fabs(phi) <
Math::pi() ? H(sn, cn, dn) :
536 (deltaH(sn, cn, dn) + phi) * H() / (
Math::pi()/2);
540 static const real tolJAC =
541 sqrt(numeric_limits<real>::epsilon() *
real(0.01));
542 real n = floor(x / (2 * _eEc) +
real(0.5));
545 real phi =
Math::pi() * x / (2 * _eEc);
547 phi -= _eps * sin(2 * phi) / 2;
556 err = (E(sn, cn, dn) - x)/dn;
558 if (!(fabs(err) > tolJAC))
566 if (signbit(ctau)) { ctau = -ctau; stau = -stau; }
567 real tau = atan2(stau, ctau);
568 return Einv( tau * E() / (
Math::pi()/2) ) - tau;
Header for GeographicLib::EllipticFunction class.
GeographicLib::Math::real real
#define GEOGRAPHICLIB_PANIC
void sncndn(real x, real &sn, real &cn, real &dn) const
static real RJ(real x, real y, real z, real p)
Math::real deltaG(real sn, real cn, real dn) const
static real RG(real x, real y, real z)
Math::real deltaE(real sn, real cn, real dn) const
Math::real F(real phi) const
static real RC(real x, real y)
Math::real Einv(real x) const
static real RD(real x, real y, real z)
void Reset(real k2=0, real alpha2=0)
Math::real deltaD(real sn, real cn, real dn) const
Math::real Ed(real ang) const
Math::real deltaH(real sn, real cn, real dn) const
Math::real deltaF(real sn, real cn, real dn) const
static real RF(real x, real y, real z)
Math::real deltaPi(real sn, real cn, real dn) const
Math::real deltaEinv(real stau, real ctau) const
Exception handling for GeographicLib.
static void sincosd(T x, T &sinx, T &cosx)
static T AngNormalize(T x)
Namespace for GeographicLib.
void swap(GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &a, GeographicLib::NearestNeighbor< dist_t, pos_t, distfun_t > &b)