14 # pragma warning (disable: 4127)
23 , epsx_(
Math::sq(eps_))
24 , epsx2_(
Math::sq(epsx_))
33 , _qZ(1 + _e2m * atanhee(
real(1)))
34 , _qx(_qZ / ( 2 * _e2m ))
42 if (!(
abs(stdlat) <= 90))
46 Init(sphi, cphi, sphi, cphi,
k0);
52 , epsx_(
Math::sq(eps_))
53 , epsx2_(
Math::sq(epsx_))
62 , _qZ(1 + _e2m * atanhee(
real(1)))
63 , _qx(_qZ / ( 2 * _e2m ))
71 if (!(
abs(stdlat1) <= 90))
72 throw GeographicErr(
"Standard latitude 1 not in [-90d, 90d]");
73 if (!(
abs(stdlat2) <= 90))
74 throw GeographicErr(
"Standard latitude 2 not in [-90d, 90d]");
75 real sphi1, cphi1, sphi2, cphi2;
78 Init(sphi1, cphi1, sphi2, cphi2,
k1);
86 , epsx_(
Math::sq(eps_))
87 , epsx2_(
Math::sq(epsx_))
96 , _qZ(1 + _e2m * atanhee(
real(1)))
97 , _qx(_qZ / ( 2 * _e2m ))
106 throw GeographicErr(
"Standard latitude 1 not in [-90d, 90d]");
108 throw GeographicErr(
"Standard latitude 2 not in [-90d, 90d]");
109 if (!(
abs(sinlat1) <= 1 && coslat1 <= 1) || (coslat1 == 0 && sinlat1 == 0))
110 throw GeographicErr(
"Bad sine/cosine of standard latitude 1");
111 if (!(
abs(sinlat2) <= 1 && coslat2 <= 1) || (coslat2 == 0 && sinlat2 == 0))
112 throw GeographicErr(
"Bad sine/cosine of standard latitude 2");
113 if (coslat1 == 0 && coslat2 == 0 && sinlat1 * sinlat2 <= 0)
115 (
"Standard latitudes cannot be opposite poles");
116 Init(sinlat1, coslat1, sinlat2, coslat2,
k1);
124 sphi1 /= r; cphi1 /= r;
126 sphi2 /= r; cphi2 /= r;
128 bool polar = (cphi1 == 0);
132 _sign = sphi1 + sphi2 >= 0 ? 1 : -1;
136 swap(sphi1, sphi2);
swap(cphi1, cphi2);
139 tphi1 = sphi1/cphi1, tphi2 = sphi2/cphi2;
164 if (polar || tphi1 == tphi2) {
169 tbet1 =
_fm * tphi1, scbet12 = 1 +
Math::sq(tbet1),
170 tbet2 =
_fm * tphi2, scbet22 = 1 +
Math::sq(tbet2),
171 txi1 =
txif(tphi1), cxi1 = 1/
hyp(txi1), sxi1 = txi1 * cxi1,
172 txi2 =
txif(tphi2), cxi2 = 1/
hyp(txi2), sxi2 = txi2 * cxi2,
173 dtbet2 =
_fm * (tbet1 + tbet2),
180 dsxi = ( (1 +
_e2 * sphi1 * sphi2) / (es2 * es1) +
181 Datanhee(sphi2, sphi1) ) *
Dsn(tphi2, tphi1, sphi2, sphi1) /
183 den = (sxi2 + sxi1) * dtbet2 + (scbet22 + scbet12) * dsxi,
185 s = 2 * dtbet2 / den,
190 sm1 = -
Dsn(tphi2, tphi1, sphi2, sphi1) *
191 ( -( ((sphi2 <= 0 ? (1 - sxi2) / (1 - sphi2) :
192 Math::sq(cxi2/cphi2) * (1 + sphi2) / (1 + sxi2)) +
193 (sphi1 <= 0 ? (1 - sxi1) / (1 - sphi1) :
194 Math::sq(cxi1/cphi1) * (1 + sphi1) / (1 + sxi1))) ) *
195 (1 +
_e2 * (sphi1 + sphi2 + sphi1 * sphi2)) /
196 (1 + (sphi1 + sphi2 + sphi1 * sphi2)) +
197 (scbet22 * (sphi2 <= 0 ? 1 - sphi2 :
199 scbet12 * (sphi1 <= 0 ? 1 - sphi1 :
Math::sq(cphi1) / ( 1 + sphi1)))
200 * (
_e2 * (1 + sphi1 + sphi2 +
_e2 * sphi1 * sphi2)/(es1 * es2)
203 C = den / (2 * scbet12 * scbet22 * dsxi);
204 tphi0 = (tphi2 + tphi1)/2;
242 sphi0 = tphi0 / scphi0, sphi0m = 1/(scphi0 * (tphi0 + scphi0)),
247 D = sphi0m * (1 -
_e2*(1 + 2*sphi0*(1+sphi0))) / (
_e2m * (1+sphi0)),
249 dD = -2 * (1 -
_e2*
Math::sq(sphi0) * (2*sphi0+3)) /
253 B = (sphi0m *
_e2m / (1 -
_e2*sphi0) *
259 u = sm1 *
g -
s/
_qZ * (
D -
g * (
A +
B) ),
261 du = sm1 * dg -
s/
_qZ * (dD - dg * (
A +
B) -
g * dAB),
262 dtu = -u/du * (scphi0 * scphi02);
264 if (!(
abs(dtu) >= stol))
281 return cylindricalequalarea;
288 return azimuthalequalareanorth;
295 return azimuthalequalareasouth;
309 int s = tphi < 0 ? -1 : 1;
313 sphi = tphi *
sqrt(cphi2),
315 es2m1 = 1 - es1 * sphi,
317 es1m1 = (1 - es1) * sp1,
318 es2m1a =
_e2m * es2m1,
319 es1p1 = sp1 / (1 + es1);
320 return s * ( sphi / es2m1 +
atanhee(sphi) ) /
321 sqrt( ( cphi2 / (es1p1 * es2m1a) +
atanhee(cphi2 / es1m1) ) *
322 ( es1m1 / es2m1a +
atanhee(es1p1) ) );
336 scterm = scphi2/(1 +
Math::sq(txia)),
337 dtphi = (txi - txia) * scterm *
sqrt(scterm) *
340 if (!(
abs(dtphi) >= stol))
369 real os = -1,
z = 1, k = 1,
t = 0,
c = 0, en = 1;
395 tphi = sphi/cphi, txi =
txif(tphi), sxi = txi/
hyp(txi),
398 theta =
_k2 *
_n0 * lam, stheta =
sin(theta), ctheta =
cos(theta),
403 (ctheta < 0 ? 1 - ctheta :
Math::sq(stheta)/(1 + ctheta)) /
_n0 :
405 - drho * ctheta) /
_k0;
437 throw GeographicErr(
"Latitude for SetScale not in (-90d, 90d)");