14 # pragma warning (disable: 4127) 32 pow(3 * numeric_limits<real>::epsilon() *
real(0.01), 1/
real(8));
36 Q = max(max(abs(A0-x), abs(A0-y)), abs(A0-z)) / tolRF,
41 while (Q >= mul * abs(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) /
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 (abs(xn-yn) > tolRG0 * xn) {
74 real t = (xn + yn) /2;
84 atan(sqrt((y - x) / x)) / sqrt(y - x) :
85 ( x == y && y > 0 ? 1 / sqrt(y) :
90 sqrt(x / (x - y)) ) / sqrt(x - y) ) );
97 return (z * RF(x, y, z) - (x-z) * (y-z) * RD(x, y, z) / 3
98 + sqrt(x * y / z)) / 2;
104 real(2.7) * sqrt((numeric_limits<real>::epsilon() *
real(0.01)));
106 x0 = sqrt(max(x, y)),
107 y0 = sqrt(min(x, y)),
112 while (abs(xn-yn) > tolRG0 * xn) {
114 real t = (xn + yn) /2;
126 real tolRD = pow(
real(0.2) * (numeric_limits<real>::epsilon() *
real(0.01)),
129 A0 = (x + y + z + 2*p)/5,
131 delta = (p-x) * (p-y) * (p-z),
132 Q = max(max(abs(A0-x), abs(A0-y)), max(abs(A0-z), abs(A0-p))) / tolRD,
140 while (Q >= mul * abs(An)) {
143 lam = sqrt(x0)*sqrt(y0) + sqrt(y0)*sqrt(z0) + sqrt(z0)*sqrt(x0),
144 d0 = (sqrt(p0)+sqrt(x0)) * (sqrt(p0)+sqrt(y0)) * (sqrt(p0)+sqrt(z0)),
146 s += RC(1, 1 + e0)/(mul * d0);
156 X = (A0 - x) / (mul * An),
157 Y = (A0 - y) / (mul * An),
158 Z = (A0 - z) / (mul * An),
159 P = -(X + Y + Z) / 2,
160 E2 = X*Y + X*Z + Y*Z - 3*P*P,
161 E3 = X*Y*Z + 2*P * (E2 + 2*P*P),
162 E4 = (2*X*Y*Z + P * (E2 + 3*P*P)) * P,
169 return ((471240 - 540540 * E2) * E5 +
170 (612612 * E2 - 540540 * E3 - 556920) * E4 +
171 E3 * (306306 * E3 + E2 * (675675 * E2 - 706860) + 680680) +
172 E2 * ((417690 - 255255 * E2) * E2 - 875160) + 4084080) /
173 (4084080 * mul * An * sqrt(An)) + 6 * s;
178 real tolRD = pow(
real(0.2) * (numeric_limits<real>::epsilon() *
real(0.01)),
181 A0 = (x + y + 3*z)/5,
183 Q = max(max(abs(A0-x), abs(A0-y)), abs(A0-z)) / tolRD,
189 while (Q >= mul * abs(An)) {
191 real lam = sqrt(x0)*sqrt(y0) + sqrt(y0)*sqrt(z0) + sqrt(z0)*sqrt(x0);
192 s += 1/(mul * sqrt(z0) * (z0 + lam));
200 X = (A0 - x) / (mul * An),
201 Y = (A0 - y) / (mul * An),
204 E3 = (3*X*Y - 8*Z*Z)*Z,
205 E4 = 3 * (X*Y - Z*Z) * Z*Z,
212 return ((471240 - 540540 * E2) * E5 +
213 (612612 * E2 - 540540 * E3 - 556920) * E4 +
214 E3 * (306306 * E3 + E2 * (675675 * E2 - 706860) + 680680) +
215 E2 * ((417690 - 255255 * E2) * E2 - 875160) + 4084080) /
216 (4084080 * mul * An * sqrt(An)) + 3 * s;
220 real kp2, real alphap2) {
225 _eps = _k2/
Math::sq(sqrt(_kp2) + 1);
232 _Ec = _kp2 ? 2 * RG(_kp2, 1) : 1;
237 _Kc = _Ec =
Math::pi()/2; _Dc = _Kc/2;
243 _Pic = _Kc + _alpha2 * rj / 3;
245 _Gc = _kp2 ? _Kc + (_alpha2 - _k2) * rj / 3 : RC(1, _alphap2);
247 _Hc = _kp2 ? _Kc - _alphap2 * rj / 3 : RC(1, _alphap2);
249 _Pic = _Kc; _Gc = _Ec; _Hc = _Kc - _Dc;
264 real tolJAC = sqrt(numeric_limits<real>::epsilon() *
real(0.01));
266 real mc = _kp2, d = 0;
274 real m[num_], n[num_];
279 n[l] = mc = sqrt(mc);
281 if (!(abs(a - mc) > tolJAC * a)) {
299 dn = (n[l] + a) / (b + a);
302 a = 1 / sqrt(c*c + 1);
303 sn = sn < 0 ? -a : a;
312 dn = cn = 1 / cosh(x);
319 real fi = abs(sn) * RF(cn*cn, dn*dn, 1);
330 cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn,
334 RF(cn2, dn2, 1) - _k2 * sn2 * RD(cn2, dn2, 1) / 3 :
337 _kp2 * RF(cn2, dn2, 1) +
338 _k2 * _kp2 * sn2 * RD(cn2, 1, dn2) / 3 +
341 - _kp2 * sn2 * RD(dn2, 1, cn2) / 3 + dn / abs(cn) ) );
354 real di = abs(sn) * sn*sn * RD(cn*cn, dn*dn, 1) / 3;
367 cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn,
368 pii = abs(sn) * (RF(cn2, dn2, 1) +
369 _alpha2 * sn2 * RJ(cn2, dn2, 1, 1 - _alpha2 * sn2) / 3);
372 pii = 2 * Pi() - pii;
380 cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn,
381 gi = abs(sn) * (RF(cn2, dn2, 1) +
382 (_alpha2 - _k2) * sn2 *
383 RJ(cn2, dn2, 1, cn2 + _alphap2 * sn2) / 3);
394 cn2 = cn*cn, dn2 = dn*dn, sn2 = sn*sn,
395 hi = abs(sn) * (RF(cn2, dn2, 1) -
397 RJ(cn2, dn2, 1, cn2 + _alphap2 * sn2) / 3);
408 if (cn < 0) { cn = -cn; sn = -sn; }
409 return F(sn, cn, dn) * (
Math::pi()/2) / K() - atan2(sn, cn);
414 if (cn < 0) { cn = -cn; sn = -sn; }
415 return E(sn, cn, dn) * (
Math::pi()/2) / E() - atan2(sn, cn);
421 if (cn < 0) { cn = -cn; sn = -sn; }
422 return Pi(sn, cn, dn) * (
Math::pi()/2) / Pi() - atan2(sn, cn);
427 if (cn < 0) { cn = -cn; sn = -sn; }
428 return D(sn, cn, dn) * (
Math::pi()/2) / D() - atan2(sn, cn);
433 if (cn < 0) { cn = -cn; sn = -sn; }
434 return G(sn, cn, dn) * (
Math::pi()/2) / G() - atan2(sn, cn);
439 if (cn < 0) { cn = -cn; sn = -sn; }
440 return H(sn, cn, dn) * (
Math::pi()/2) / H() - atan2(sn, cn);
444 real sn = sin(phi), cn = cos(phi);
445 return (deltaF(sn, cn, Delta(sn, cn)) + phi) * K() / (
Math::pi()/2);
449 real sn = sin(phi), cn = cos(phi);
450 return (deltaE(sn, cn, Delta(sn, cn)) + phi) * E() / (
Math::pi()/2);
454 real n = ceil(ang/360 -
real(0.5));
458 sn = abs(ang) == 180 ? 0 : sin(phi),
459 cn = abs(ang) == 90 ? 0 : cos(phi);
460 return E(sn, cn, Delta(sn, cn)) + 4 * E() * n;
464 real sn = sin(phi), cn = cos(phi);
465 return (deltaPi(sn, cn, Delta(sn, cn)) + phi) * Pi() / (
Math::pi()/2);
469 real sn = sin(phi), cn = cos(phi);
470 return (deltaD(sn, cn, Delta(sn, cn)) + phi) * D() / (
Math::pi()/2);
474 real sn = sin(phi), cn = cos(phi);
475 return (deltaG(sn, cn, Delta(sn, cn)) + phi) * G() / (
Math::pi()/2);
479 real sn = sin(phi), cn = cos(phi);
480 return (deltaH(sn, cn, Delta(sn, cn)) + phi) * H() / (
Math::pi()/2);
484 real tolJAC = sqrt(numeric_limits<real>::epsilon() *
real(0.01));
485 real n = floor(x / (2 * _Ec) + 0.5);
488 real phi =
Math::pi() * x / (2 * _Ec);
490 phi -= _eps * sin(2 * phi) / 2;
496 err = (E(sn, cn, dn) - x)/dn;
498 if (abs(err) < tolJAC)
506 if (ctau < 0) { ctau = -ctau; stau = -stau; }
507 real tau = atan2(stau, ctau);
508 return Einv( tau * E() / (
Math::pi()/2) ) - tau;
void sncndn(real x, real &sn, real &cn, real &dn) const
void Reset(real k2=0, real alpha2=0)
GeographicLib::Math::real real
Math::real deltaPi(real sn, real cn, real dn) const
Math::real deltaE(real sn, real cn, real dn) const
static real RG(real x, real y, real z)
static real RF(real x, real y, real z)
static real RC(real x, real y)
Namespace for GeographicLib.
Header for GeographicLib::EllipticFunction class.
Math::real F(real phi) const
Math::real deltaH(real sn, real cn, real dn) const
Math::real deltaG(real sn, real cn, real dn) const
Math::real Ed(real ang) const
Math::real Einv(real x) const
Math::real deltaD(real sn, real cn, real dn) const
static real RD(real x, real y, real z)
Math::real deltaEinv(real stau, real ctau) const
static real RJ(real x, real y, real z, real p)
#define GEOGRAPHICLIB_PANIC
Math::real deltaF(real sn, real cn, real dn) const