46 # pragma warning (disable: 4127)
54 : tol_(real(0.1)*sqrt(numeric_limits<real>::epsilon()))
56 , _f(f <= 1 ? f : 1/f)
63 , _c( sqrt(_e2m) * exp(eatanhe(real(1))) )
77 _b1 = 1/(1+_n)*(nx*(nx+16)+64)/64;
78 _alp[1] = _n*(_n*(_n*(164*_n+225)-480)+360)/720;
79 _bet[1] = _n*(_n*((555-4*_n)*_n-960)+720)/1440;
80 _alp[2] = nx*(_n*(557*_n-864)+390)/1440;
81 _bet[2] = nx*((96-437*_n)*_n+30)/1440;
83 _alp[3] = (427-1236*_n)*nx/1680;
84 _bet[3] = (119-148*_n)*nx/3360;
86 _alp[4] = 49561*nx/161280;
87 _bet[4] = 4397*nx/161280;
90 _b1 = 1/(1+_n)*(nx*(nx+16)+64)/64;
91 _alp[1] = _n*(_n*(_n*((328-635*_n)*_n+450)-960)+720)/1440;
92 _bet[1] = _n*(_n*(_n*((-3645*_n-64)*_n+8880)-15360)+11520)/23040;
93 _alp[2] = nx*(_n*(_n*(4496*_n+3899)-6048)+2730)/10080;
94 _bet[2] = nx*(_n*(_n*(4416*_n-3059)+672)+210)/10080;
96 _alp[3] = nx*(_n*(15061*_n-19776)+6832)/26880;
97 _bet[3] = nx*((-627*_n-592)*_n+476)/13440;
99 _alp[4] = (49561-171840*_n)*nx/161280;
100 _bet[4] = (4397-3520*_n)*nx/161280;
102 _alp[5] = 34729*nx/80640;
103 _bet[5] = 4583*nx/161280;
106 _b1 = 1/(1+_n)*(nx*(nx*(nx+4)+64)+256)/256;
107 _alp[1] = _n*(_n*(_n*(_n*(_n*(31564*_n-66675)+34440)+47250)-100800)+
109 _bet[1] = _n*(_n*(_n*(_n*(_n*(384796*_n-382725)-6720)+932400)-1612800)+
111 _alp[2] = nx*(_n*(_n*((863232-1983433*_n)*_n+748608)-1161216)+524160)/
113 _bet[2] = nx*(_n*(_n*((1695744-1118711*_n)*_n-1174656)+258048)+80640)/
116 _alp[3] = nx*(_n*(_n*(670412*_n+406647)-533952)+184464)/725760;
117 _bet[3] = nx*(_n*(_n*(22276*_n-16929)-15984)+12852)/362880;
119 _alp[4] = nx*(_n*(6601661*_n-7732800)+2230245)/7257600;
120 _bet[4] = nx*((-830251*_n-158400)*_n+197865)/7257600;
122 _alp[5] = (3438171-13675556*_n)*nx/7983360;
123 _bet[5] = (453717-435388*_n)*nx/15966720;
125 _alp[6] = 212378941*nx/319334400;
126 _bet[6] = 20648693*nx/638668800;
129 _b1 = 1/(1+_n)*(nx*(nx*(nx+4)+64)+256)/256;
130 _alp[1] = _n*(_n*(_n*(_n*(_n*(_n*(1804025*_n+2020096)-4267200)+2204160)+
131 3024000)-6451200)+4838400)/9676800;
132 _bet[1] = _n*(_n*(_n*(_n*(_n*((6156736-5406467*_n)*_n-6123600)-107520)+
133 14918400)-25804800)+19353600)/38707200;
134 _alp[2] = nx*(_n*(_n*(_n*(_n*(4626384*_n-9917165)+4316160)+3743040)-
135 5806080)+2620800)/9676800;
136 _bet[2] = nx*(_n*(_n*(_n*(_n*(829456*_n-5593555)+8478720)-5873280)+
137 1290240)+403200)/19353600;
139 _alp[3] = nx*(_n*(_n*((26816480-67102379*_n)*_n+16265880)-21358080)+
141 _bet[3] = nx*(_n*(_n*(_n*(9261899*_n+3564160)-2708640)-2557440)+
144 _alp[4] = nx*(_n*(_n*(155912000*_n+72618271)-85060800)+24532695)/
146 _bet[4] = nx*(_n*(_n*(14928352*_n-9132761)-1742400)+2176515)/79833600;
148 _alp[5] = nx*(_n*(102508609*_n-109404448)+27505368)/63866880;
149 _bet[5] = nx*((-8005831*_n-1741552)*_n+1814868)/63866880;
151 _alp[6] = (2760926233LL-12282192400LL*_n)*nx/4151347200LL;
152 _bet[6] = (268433009-261810608*_n)*nx/8302694400LL;
154 _alp[7] = 1522256789LL*nx/1383782400LL;
155 _bet[7] = 219941297*nx/5535129600LL;
158 _b1 = 1/(1+_n)*(nx*(nx*(nx*(25*nx+64)+256)+4096)+16384)/16384;
159 _alp[1] = _n*(_n*(_n*(_n*(_n*(_n*((37884525-75900428*_n)*_n+42422016)-
160 89611200)+46287360)+63504000)-135475200)+
161 101606400)/203212800;
162 _bet[1] = _n*(_n*(_n*(_n*(_n*(_n*(_n*(31777436*_n-37845269)+43097152)-
163 42865200)-752640)+104428800)-180633600)+
164 135475200)/270950400;
165 _alp[2] = nx*(_n*(_n*(_n*(_n*(_n*(148003883*_n+83274912)-178508970)+
166 77690880)+67374720)-104509440)+47174400)/
168 _bet[2] = nx*(_n*(_n*(_n*(_n*(_n*(24749483*_n+14930208)-100683990)+
169 152616960)-105719040)+23224320)+7257600)/
172 _alp[3] = nx*(_n*(_n*(_n*(_n*(318729724*_n-738126169)+294981280)+
173 178924680)-234938880)+81164160)/319334400;
174 _bet[3] = nx*(_n*(_n*(_n*((101880889-232468668*_n)*_n+39205760)-
175 29795040)-28131840)+22619520)/638668800;
177 _alp[4] = nx*(_n*(_n*((14967552000LL-40176129013LL*_n)*_n+6971354016LL)-
178 8165836800LL)+2355138720LL)/7664025600LL;
179 _bet[4] = nx*(_n*(_n*(_n*(324154477*_n+1433121792LL)-876745056)-
180 167270400)+208945440)/7664025600LL;
182 _alp[5] = nx*(_n*(_n*(10421654396LL*_n+3997835751LL)-4266773472LL)+
183 1072709352LL)/2490808320LL;
184 _bet[5] = nx*(_n*(_n*(457888660*_n-312227409)-67920528)+70779852)/
187 _alp[6] = nx*(_n*(175214326799LL*_n-171950693600LL)+38652967262LL)/
189 _bet[6] = nx*((-19841813847LL*_n-3665348512LL)*_n+3758062126LL)/
192 _alp[7] = (13700311101LL-67039739596LL*_n)*nx/12454041600LL;
193 _bet[7] = (1979471673LL-1989295244LL*_n)*nx/49816166400LL;
195 _alp[8] = 1424729850961LL*nx/743921418240LL;
196 _bet[8] = 191773887257LL*nx/3719607091200LL;
199 GEOGRAPHICLIB_STATIC_ASSERT(maxpow_ >= 4 && maxpow_ <= 8,
200 "Bad value of maxpow_");
280 if (!(abs(tau) < overflow()))
284 sig = sinh( eatanhe(tau / tau1) );
289 if (!(abs(taup) < overflow()))
298 stol = tol_ * max(
real(1), abs(taup));
303 sig = sinh( eatanhe( tau / tau1 ) ),
305 dtau = (taup - taupa) * (1 + _e2m *
Math::sq(tau)) /
308 if (!(abs(dtau) >= stol))
315 real& x, real& y, real& gamma, real& k)
320 latsign = lat < 0 ? -1 : 1,
321 lonsign = lon < 0 ? -1 : 1;
324 bool backside = lon > 90;
353 c = max(real(0), cos(lam)),
356 xip = atan2(taup, c);
363 gamma = atan(tanx(lam) *
434 c0 = cos(2 * xip), ch0 = cosh(2 * etap),
435 s0 = sin(2 * xip), sh0 = sinh(2 * etap),
436 ar = 2 * c0 * ch0, ai = -2 * s0 * sh0;
439 xi0 = (n & 1 ? _alp[n] : 0), eta0 = 0,
442 yr0 = (n & 1 ? 2 * maxpow_ * _alp[n--] : 0), yi0 = 0,
445 xi1 = ar * xi0 - ai * eta0 - xi1 + _alp[n];
446 eta1 = ai * xi0 + ar * eta0 - eta1;
447 yr1 = ar * yr0 - ai * yi0 - yr1 + 2 * n * _alp[n];
448 yi1 = ai * yr0 + ar * yi0 - yi1;
450 xi0 = ar * xi1 - ai * eta1 - xi0 + _alp[n];
451 eta0 = ai * xi1 + ar * eta1 - eta0;
452 yr0 = ar * yr1 - ai * yi1 - yr0 + 2 * n * _alp[n];
453 yi0 = ai * yr1 + ar * yi1 - yi0;
457 yr1 = 1 - yr1 + ar * yr0 - ai * yi0;
458 yi1 = - yi1 + ai * yr0 + ar * yi0;
459 ar = s0 * ch0; ai = c0 * sh0;
461 xi = xip + ar * xi0 - ai * eta0,
462 eta = etap + ai * xi0 + ar * eta0;
465 gamma -= atan2(yi1, yr1);
468 y = _a1 * _k0 * (backside ?
Math::pi() - xi : xi) * latsign;
469 x = _a1 * _k0 * eta * lonsign;
472 gamma *= latsign * lonsign;
477 real& lat, real& lon, real& gamma, real& k)
483 xi = y / (_a1 * _k0),
484 eta = x / (_a1 * _k0);
487 xisign = xi < 0 ? -1 : 1,
488 etasign = eta < 0 ? -1 : 1;
495 c0 = cos(2 * xi), ch0 = cosh(2 * eta),
496 s0 = sin(2 * xi), sh0 = sinh(2 * eta),
497 ar = 2 * c0 * ch0, ai = -2 * s0 * sh0;
500 xip0 = (n & 1 ? -_bet[n] : 0), etap0 = 0,
503 yr0 = (n & 1 ? - 2 * maxpow_ * _bet[n--] : 0), yi0 = 0,
506 xip1 = ar * xip0 - ai * etap0 - xip1 - _bet[n];
507 etap1 = ai * xip0 + ar * etap0 - etap1;
508 yr1 = ar * yr0 - ai * yi0 - yr1 - 2 * n * _bet[n];
509 yi1 = ai * yr0 + ar * yi0 - yi1;
511 xip0 = ar * xip1 - ai * etap1 - xip0 - _bet[n];
512 etap0 = ai * xip1 + ar * etap1 - etap0;
513 yr0 = ar * yr1 - ai * yi1 - yr0 - 2 * n * _bet[n];
514 yi0 = ai * yr1 + ar * yi1 - yi0;
518 yr1 = 1 - yr1 + ar * yr0 - ai * yi0;
519 yi1 = - yi1 + ai * yr0 + ar * yi0;
520 ar = s0 * ch0; ai = c0 * sh0;
522 xip = xi + ar * xip0 - ai * etap0,
523 etap = eta + ai * xip0 + ar * etap0;
525 gamma = atan2(yi1, yr1);
535 c = max(real(0), cos(xip)),
544 gamma += atan(tanx(xip) * tanh(etap));
546 k *= sqrt(_e2m + _e2 *
Math::sq(cos(phi))) *
562 gamma *= xisign * etasign;
static T AngNormalize(T x)
GeographicLib::Math::real real
static bool isfinite(T x)
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
Exception handling for GeographicLib.
#define GEOGRAPHICLIB_PANIC