50 , _f(f <= 1 ? f : 1/f)
53 , _es((f < 0 ? -1 : 1) * sqrt(abs(_e2)))
57 , _c( sqrt(_e2m) * exp(
Math::eatanhe(real(1), _es)) )
71 _b1 = 1/(1+_n)*(nx*(nx+16)+64)/64;
72 _alp[1] = _n*(_n*(_n*(164*_n+225)-480)+360)/720;
73 _bet[1] = _n*(_n*((555-4*_n)*_n-960)+720)/1440;
74 _alp[2] = nx*(_n*(557*_n-864)+390)/1440;
75 _bet[2] = nx*((96-437*_n)*_n+30)/1440;
77 _alp[3] = (427-1236*_n)*nx/1680;
78 _bet[3] = (119-148*_n)*nx/3360;
80 _alp[4] = 49561*nx/161280;
81 _bet[4] = 4397*nx/161280;
84 _b1 = 1/(1+_n)*(nx*(nx+16)+64)/64;
85 _alp[1] = _n*(_n*(_n*((328-635*_n)*_n+450)-960)+720)/1440;
86 _bet[1] = _n*(_n*(_n*((-3645*_n-64)*_n+8880)-15360)+11520)/23040;
87 _alp[2] = nx*(_n*(_n*(4496*_n+3899)-6048)+2730)/10080;
88 _bet[2] = nx*(_n*(_n*(4416*_n-3059)+672)+210)/10080;
90 _alp[3] = nx*(_n*(15061*_n-19776)+6832)/26880;
91 _bet[3] = nx*((-627*_n-592)*_n+476)/13440;
93 _alp[4] = (49561-171840*_n)*nx/161280;
94 _bet[4] = (4397-3520*_n)*nx/161280;
96 _alp[5] = 34729*nx/80640;
97 _bet[5] = 4583*nx/161280;
100 _b1 = 1/(1+_n)*(nx*(nx*(nx+4)+64)+256)/256;
101 _alp[1] = _n*(_n*(_n*(_n*(_n*(31564*_n-66675)+34440)+47250)-100800)+
103 _bet[1] = _n*(_n*(_n*(_n*(_n*(384796*_n-382725)-6720)+932400)-1612800)+
105 _alp[2] = nx*(_n*(_n*((863232-1983433*_n)*_n+748608)-1161216)+524160)/
107 _bet[2] = nx*(_n*(_n*((1695744-1118711*_n)*_n-1174656)+258048)+80640)/
110 _alp[3] = nx*(_n*(_n*(670412*_n+406647)-533952)+184464)/725760;
111 _bet[3] = nx*(_n*(_n*(22276*_n-16929)-15984)+12852)/362880;
113 _alp[4] = nx*(_n*(6601661*_n-7732800)+2230245)/7257600;
114 _bet[4] = nx*((-830251*_n-158400)*_n+197865)/7257600;
116 _alp[5] = (3438171-13675556*_n)*nx/7983360;
117 _bet[5] = (453717-435388*_n)*nx/15966720;
119 _alp[6] = 212378941*nx/319334400;
120 _bet[6] = 20648693*nx/638668800;
123 _b1 = 1/(1+_n)*(nx*(nx*(nx+4)+64)+256)/256;
124 _alp[1] = _n*(_n*(_n*(_n*(_n*(_n*(1804025*_n+2020096)-4267200)+2204160)+
125 3024000)-6451200)+4838400)/9676800;
126 _bet[1] = _n*(_n*(_n*(_n*(_n*((6156736-5406467*_n)*_n-6123600)-107520)+
127 14918400)-25804800)+19353600)/38707200;
128 _alp[2] = nx*(_n*(_n*(_n*(_n*(4626384*_n-9917165)+4316160)+3743040)-
129 5806080)+2620800)/9676800;
130 _bet[2] = nx*(_n*(_n*(_n*(_n*(829456*_n-5593555)+8478720)-5873280)+
131 1290240)+403200)/19353600;
133 _alp[3] = nx*(_n*(_n*((26816480-67102379*_n)*_n+16265880)-21358080)+
135 _bet[3] = nx*(_n*(_n*(_n*(9261899*_n+3564160)-2708640)-2557440)+
138 _alp[4] = nx*(_n*(_n*(155912000*_n+72618271)-85060800)+24532695)/
140 _bet[4] = nx*(_n*(_n*(14928352*_n-9132761)-1742400)+2176515)/79833600;
142 _alp[5] = nx*(_n*(102508609*_n-109404448)+27505368)/63866880;
143 _bet[5] = nx*((-8005831*_n-1741552)*_n+1814868)/63866880;
145 _alp[6] = (2760926233LL-12282192400LL*_n)*nx/4151347200LL;
146 _bet[6] = (268433009-261810608*_n)*nx/8302694400LL;
148 _alp[7] = 1522256789LL*nx/1383782400LL;
149 _bet[7] = 219941297*nx/5535129600LL;
152 _b1 = 1/(1+_n)*(nx*(nx*(nx*(25*nx+64)+256)+4096)+16384)/16384;
153 _alp[1] = _n*(_n*(_n*(_n*(_n*(_n*((37884525-75900428*_n)*_n+42422016)-
154 89611200)+46287360)+63504000)-135475200)+
155 101606400)/203212800;
156 _bet[1] = _n*(_n*(_n*(_n*(_n*(_n*(_n*(31777436*_n-37845269)+43097152)-
157 42865200)-752640)+104428800)-180633600)+
158 135475200)/270950400;
159 _alp[2] = nx*(_n*(_n*(_n*(_n*(_n*(148003883*_n+83274912)-178508970)+
160 77690880)+67374720)-104509440)+47174400)/
162 _bet[2] = nx*(_n*(_n*(_n*(_n*(_n*(24749483*_n+14930208)-100683990)+
163 152616960)-105719040)+23224320)+7257600)/
166 _alp[3] = nx*(_n*(_n*(_n*(_n*(318729724*_n-738126169)+294981280)+
167 178924680)-234938880)+81164160)/319334400;
168 _bet[3] = nx*(_n*(_n*(_n*((101880889-232468668*_n)*_n+39205760)-
169 29795040)-28131840)+22619520)/638668800;
171 _alp[4] = nx*(_n*(_n*((14967552000LL-40176129013LL*_n)*_n+6971354016LL)-
172 8165836800LL)+2355138720LL)/7664025600LL;
173 _bet[4] = nx*(_n*(_n*(_n*(324154477*_n+1433121792LL)-876745056)-
174 167270400)+208945440)/7664025600LL;
176 _alp[5] = nx*(_n*(_n*(10421654396LL*_n+3997835751LL)-4266773472LL)+
177 1072709352LL)/2490808320LL;
178 _bet[5] = nx*(_n*(_n*(457888660*_n-312227409)-67920528)+70779852)/
181 _alp[6] = nx*(_n*(175214326799LL*_n-171950693600LL)+38652967262LL)/
183 _bet[6] = nx*((-19841813847LL*_n-3665348512LL)*_n+3758062126LL)/
186 _alp[7] = (13700311101LL-67039739596LL*_n)*nx/12454041600LL;
187 _bet[7] = (1979471673LL-1989295244LL*_n)*nx/49816166400LL;
189 _alp[8] = 1424729850961LL*nx/743921418240LL;
190 _bet[8] = 191773887257LL*nx/3719607091200LL;
193 GEOGRAPHICLIB_STATIC_ASSERT(maxpow_ >= 4 && maxpow_ <= 8,
194 "Bad value of maxpow_");
275 real& x, real& y, real& gamma, real& k)
280 latsign = lat < 0 ? -1 : 1,
281 lonsign = lon < 0 ? -1 : 1;
284 bool backside = lon > 90;
313 c = max(real(0), cos(lam)),
316 xip = atan2(taup, c);
394 c0 = cos(2 * xip), ch0 = cosh(2 * etap),
395 s0 = sin(2 * xip), sh0 = sinh(2 * etap),
396 ar = 2 * c0 * ch0, ai = -2 * s0 * sh0;
399 xi0 = (n & 1 ? _alp[n] : 0), eta0 = 0,
402 yr0 = (n & 1 ? 2 * maxpow_ * _alp[n--] : 0), yi0 = 0,
405 xi1 = ar * xi0 - ai * eta0 - xi1 + _alp[n];
406 eta1 = ai * xi0 + ar * eta0 - eta1;
407 yr1 = ar * yr0 - ai * yi0 - yr1 + 2 * n * _alp[n];
408 yi1 = ai * yr0 + ar * yi0 - yi1;
410 xi0 = ar * xi1 - ai * eta1 - xi0 + _alp[n];
411 eta0 = ai * xi1 + ar * eta1 - eta0;
412 yr0 = ar * yr1 - ai * yi1 - yr0 + 2 * n * _alp[n];
413 yi0 = ai * yr1 + ar * yi1 - yi0;
417 yr1 = 1 - yr1 + ar * yr0 - ai * yi0;
418 yi1 = - yi1 + ai * yr0 + ar * yi0;
419 ar = s0 * ch0; ai = c0 * sh0;
421 xi = xip + ar * xi0 - ai * eta0,
422 eta = etap + ai * xi0 + ar * eta0;
425 gamma -= atan2(yi1, yr1);
428 y = _a1 * _k0 * (backside ?
Math::pi() - xi : xi) * latsign;
429 x = _a1 * _k0 * eta * lonsign;
432 gamma *= latsign * lonsign;
437 real& lat, real& lon, real& gamma, real& k)
443 xi = y / (_a1 * _k0),
444 eta = x / (_a1 * _k0);
447 xisign = xi < 0 ? -1 : 1,
448 etasign = eta < 0 ? -1 : 1;
455 c0 = cos(2 * xi), ch0 = cosh(2 * eta),
456 s0 = sin(2 * xi), sh0 = sinh(2 * eta),
457 ar = 2 * c0 * ch0, ai = -2 * s0 * sh0;
460 xip0 = (n & 1 ? -_bet[n] : 0), etap0 = 0,
463 yr0 = (n & 1 ? - 2 * maxpow_ * _bet[n--] : 0), yi0 = 0,
466 xip1 = ar * xip0 - ai * etap0 - xip1 - _bet[n];
467 etap1 = ai * xip0 + ar * etap0 - etap1;
468 yr1 = ar * yr0 - ai * yi0 - yr1 - 2 * n * _bet[n];
469 yi1 = ai * yr0 + ar * yi0 - yi1;
471 xip0 = ar * xip1 - ai * etap1 - xip0 - _bet[n];
472 etap0 = ai * xip1 + ar * etap1 - etap0;
473 yr0 = ar * yr1 - ai * yi1 - yr0 - 2 * n * _bet[n];
474 yi0 = ai * yr1 + ar * yi1 - yi0;
478 yr1 = 1 - yr1 + ar * yr0 - ai * yi0;
479 yi1 = - yi1 + ai * yr0 + ar * yi0;
480 ar = s0 * ch0; ai = c0 * sh0;
482 xip = xi + ar * xip0 - ai * etap0,
483 etap = eta + ai * xip0 + ar * etap0;
485 gamma = atan2(yi1, yr1);
495 c = max(real(0), cos(xip)),
503 gamma += atan2(sxip * tanh(etap), c);
506 k *= sqrt(_e2m + _e2 *
Math::sq(cos(phi))) *
522 gamma *= xisign * etasign;
static T AngNormalize(T x)
static bool isfinite(T x)
Mathematical functions needed by GeographicLib.
void Forward(real lon0, real lat, real lon, real &x, real &y, real &gamma, real &k) const
Transverse Mercator projection.
static const TransverseMercator & UTM()
Header for GeographicLib::TransverseMercator class.
TransverseMercator(real a, real f, real k0)
Namespace for GeographicLib.
static T AngDiff(T x, T y)
void Reverse(real lon0, real x, real y, real &lat, real &lon, real &gamma, real &k) const
static T tauf(T taup, T es)
Exception handling for GeographicLib.
static T taupf(T tau, T es)