35 # pragma warning (disable: 4701 4127)
43 : maxit2_(maxit1_ +
Math::digits() + 10)
54 , tolb_(tol0_ * tol2_)
55 , xthresh_(1000 * tol2_)
60 , _ep2(_e2 /
Math::sq(_f1))
83 , _etol2(
real(0.1) * tol2_ /
107 ar = 2 * (cosx - sinx) * (cosx + sinx),
108 y0 =
n & 1 ? *--
c : 0,
y1 = 0;
116 return cosx * (
y0 -
y1);
120 unsigned caps)
const {
125 bool arcmode,
real s12_a12,
135 GenPosition(arcmode, s12_a12, outmask,
136 lat2, lon2, azi2, s12, m12, M12, M21, S12);
141 bool arcmode,
real s12_a12,
142 unsigned caps)
const {
150 caps, arcmode, s12_a12);
155 unsigned caps)
const {
161 unsigned caps)
const {
167 unsigned outmask,
real& s12,
177 int lonsign = lon12 >= 0 ? 1 : -1;
195 int swapp =
abs(lat1) <
abs(lat2) ? -1 : 1;
201 int latsign = lat1 < 0 ? 1 : -1;
216 real sbet1, cbet1, sbet2, cbet2, s12x, m12x;
238 if (cbet1 < -sbet1) {
240 sbet2 = sbet2 < 0 ? sbet1 : -sbet1;
242 if (
abs(sbet2) == -sbet1)
254 bool meridian = lat1 == -90 || slam12 == 0;
261 calp1 = clam12; salp1 = slam12;
262 calp2 = 1; salp2 = 0;
266 ssig1 = sbet1, csig1 = calp1 * cbet1,
267 ssig2 = sbet2, csig2 = calp2 * cbet2;
270 sig12 =
atan2(
max(
real(0), csig1 * ssig2 - ssig1 * csig2),
271 csig1 * csig2 + ssig1 * ssig2);
274 Lengths(
E, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
276 s12x, m12x,
dummy, M12, M21);
285 if (sig12 < 1 || m12x >= 0) {
287 if (sig12 < 3 *
tiny_)
288 sig12 = m12x = s12x = 0;
298 real omg12 = 0, somg12 = 2, comg12 = 0;
301 (_f <= 0 || lon12s >=
_f * 180)) {
304 calp1 = calp2 = 0; salp1 = salp2 = 1;
306 sig12 = omg12 = lam12 /
_f1;
307 m12x =
_b *
sin(sig12);
309 M12 = M21 =
cos(sig12);
312 }
else if (!meridian) {
319 sig12 =
InverseStart(
E, sbet1, cbet1, dn1, sbet2, cbet2, dn2,
320 lam12, slam12, clam12,
321 salp1, calp1, salp2, calp2, dnm);
325 s12x = sig12 *
_b * dnm;
328 M12 = M21 =
cos(sig12 / dnm);
330 omg12 = lam12 / (
_f1 * dnm);
346 real ssig1 = 0, csig1 = 0, ssig2 = 0, csig2 = 0, domg12 = 0;
350 for (
bool tripn =
false, tripb =
false;
375 real v =
Lambda12(sbet1, cbet1, dn1, sbet2, cbet2, dn2, salp1, calp1,
377 salp2, calp2, sig12, ssig1, csig1, ssig2, csig2,
380 if (tripb || !(
abs(
v) >= (tripn ? 8 : 1) *
tol0_))
break;
382 if (
v > 0 && (numit >
maxit1_ || calp1/salp1 > calp1b/salp1b))
383 { salp1b = salp1; calp1b = calp1; }
384 else if (
v < 0 && (numit >
maxit1_ || calp1/salp1 < calp1a/salp1a))
385 { salp1a = salp1; calp1a = calp1; }
386 if (numit < maxit1_ && dv > 0) {
390 sdalp1 =
sin(dalp1), cdalp1 =
cos(dalp1),
391 nsalp1 = salp1 * cdalp1 + calp1 * sdalp1;
393 calp1 = calp1 * cdalp1 - salp1 * sdalp1;
411 salp1 = (salp1a + salp1b)/2;
412 calp1 = (calp1a + calp1b)/2;
415 tripb = (
abs(salp1a - salp1) + (calp1a - calp1) <
tolb_ ||
416 abs(salp1 - salp1b) + (calp1 - calp1b) <
tolb_);
420 Lengths(
E, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
421 cbet1, cbet2, outmask, s12x, m12x,
dummy, M12, M21);
426 if (outmask &
AREA) {
428 real sdomg12 =
sin(domg12), cdomg12 =
cos(domg12);
429 somg12 = slam12 * cdomg12 - clam12 * sdomg12;
430 comg12 = clam12 * cdomg12 + slam12 * sdomg12;
441 if (outmask &
AREA) {
444 salp0 = salp1 * cbet1,
447 if (calp0 != 0 && salp0 != 0) {
450 ssig1 = sbet1, csig1 = calp1 * cbet1,
451 ssig2 = sbet2, csig2 = calp2 * cbet2,
453 eps = k2 / (2 * (1 +
sqrt(1 + k2)) + k2),
463 S12 =
A4 * (B42 - B41);
470 somg12 =
sin(omg12); comg12 =
cos(omg12);
476 comg12 > -
real(0.7071) &&
477 sbet2 - sbet1 <
real(1.75)) {
481 real domg12 = 1 + comg12, dbet1 = 1 + cbet1, dbet2 = 1 + cbet2;
482 alp12 = 2 *
atan2( somg12 * ( sbet1 * dbet2 + sbet2 * dbet1 ),
483 domg12 * ( sbet1 * sbet2 + dbet1 * dbet2 ) );
487 salp12 = salp2 * calp1 - calp2 * salp1,
488 calp12 = calp2 * calp1 + salp2 * salp1;
493 if (salp12 == 0 && calp12 < 0) {
494 salp12 =
tiny_ * calp1;
497 alp12 =
atan2(salp12, calp12);
500 S12 *= swapp * lonsign * latsign;
513 salp1 *= swapp * lonsign; calp1 *= swapp * latsign;
514 salp2 *= swapp * lonsign; calp2 *= swapp * latsign;
527 real salp1, calp1, salp2, calp2,
529 outmask, s12, salp1, calp1, salp2, calp2,
540 unsigned caps)
const {
541 real t, salp1, calp1, salp2, calp2,
544 0u,
t, salp1, calp1, salp2, calp2,
557 real cbet1,
real cbet2,
unsigned outmask,
574 (sig12 + (
E.deltaE(ssig2, csig2, dn2) -
E.deltaE(ssig1, csig1, dn1)));
579 (sig12 + (
E.deltaD(ssig2, csig2, dn2) -
E.deltaD(ssig1, csig1, dn1)));
585 m12b = dn2 * (csig1 * ssig2) - dn1 * (ssig1 * csig2) -
589 real csig12 = csig1 * csig2 + ssig1 * ssig2;
590 real t =
_ep2 * (cbet1 - cbet2) * (cbet1 + cbet2) / (dn1 + dn2);
591 M12 = csig12 + (
t * ssig2 - csig2 * J12) * ssig1 / dn1;
592 M21 = csig12 - (
t * ssig1 - csig1 * J12) * ssig2 / dn2;
605 if ( !(
q == 0 && r <= 0) ) {
614 disc =
S * (
S + 2 *
r3);
625 u +=
T + (
T != 0 ?
r2 /
T : 0);
631 u += 2 * r *
cos(ang / 3);
636 uv = u < 0 ?
q / (
v - u) : u +
v,
637 w = (uv -
q) / (2 *
v);
664 sbet12 = sbet2 * cbet1 - cbet2 * sbet1,
665 cbet12 = cbet2 * cbet1 + sbet2 * sbet1;
666 #if defined(__GNUC__) && __GNUC__ == 4 && \
667 (__GNUC_MINOR__ < 6 || defined(__MINGW32__))
681 real sbet12a = sbet2 * cbet1 + cbet2 * sbet1;
683 bool shortline = cbet12 >= 0 && sbet12 <
real(0.5) &&
684 cbet2 * lam12 <
real(0.5);
690 sbetm2 /= sbetm2 +
Math::sq(cbet1 + cbet2);
692 real omg12 = lam12 / (
_f1 * dnm);
693 somg12 =
sin(omg12); comg12 =
cos(omg12);
695 somg12 = slam12; comg12 = clam12;
698 salp1 = cbet2 * somg12;
699 calp1 = comg12 >= 0 ?
700 sbet12 + cbet2 * sbet1 *
Math::sq(somg12) / (1 + comg12) :
701 sbet12a - cbet2 * sbet1 *
Math::sq(somg12) / (1 - comg12);
705 csig12 = sbet1 * sbet2 + cbet1 * cbet2 * comg12;
707 if (shortline && ssig12 <
_etol2) {
709 salp2 = cbet1 * somg12;
710 calp2 = sbet12 - cbet1 * sbet2 *
711 (comg12 >= 0 ?
Math::sq(somg12) / (1 + comg12) : 1 - comg12);
714 sig12 =
atan2(ssig12, csig12);
722 real y, lamscale, betscale;
733 lamscale =
_e2/
_f1 * cbet1 * 2 *
E.H();
735 betscale = lamscale * cbet1;
737 x = lam12x / lamscale;
738 y = sbet12a / betscale;
742 cbet12a = cbet2 * cbet1 - sbet2 * sbet1,
743 bet12a =
atan2(sbet12a, cbet12a);
748 sbet1, -cbet1, dn1, sbet2, cbet2, dn2,
751 betscale =
x < -
real(0.01) ? sbet12a /
x :
753 lamscale = betscale / cbet1;
754 y = lam12x / lamscale;
803 omg12a = lamscale * (
_f >= 0 ? -
x * k/(1 + k) : -
y * (1 + k)/k );
804 somg12 =
sin(omg12a); comg12 = -
cos(omg12a);
806 salp1 = cbet2 * somg12;
807 calp1 = sbet12a - cbet2 * sbet1 *
Math::sq(somg12) / (1 - comg12);
814 salp1 = 1; calp1 = 0;
829 bool diffp,
real& dlam12)
const
832 if (sbet1 == 0 && calp1 == 0)
839 salp0 = salp1 * cbet1,
842 real somg1, comg1, somg2, comg2, somg12, comg12, cchi1, cchi2, lam12;
845 ssig1 = sbet1; somg1 = salp0 * sbet1;
846 csig1 = comg1 = calp1 * cbet1;
848 cchi1 =
_f1 * dn1 * comg1;
857 salp2 = cbet2 != cbet1 ? salp0 / cbet2 : salp1;
862 calp2 = cbet2 != cbet1 ||
abs(sbet2) != -sbet1 ?
865 (cbet2 - cbet1) * (cbet1 + cbet2) :
866 (sbet1 - sbet2) * (sbet1 + sbet2))) / cbet2 :
870 ssig2 = sbet2; somg2 = salp0 * sbet2;
871 csig2 = comg2 = calp2 * cbet2;
873 cchi2 =
_f1 * dn2 * comg2;
879 sig12 =
atan2(
max(
real(0), csig1 * ssig2 - ssig1 * csig2),
880 csig1 * csig2 + ssig1 * ssig2);
883 somg12 =
max(
real(0), comg1 * somg2 - somg1 * comg2);
884 comg12 = comg1 * comg2 + somg1 * somg2;
889 schi12 =
max(
real(0), cchi1 * somg2 - somg1 * cchi2),
890 cchi12 = cchi1 * cchi2 + somg1 * somg2;
892 real eta =
atan2(schi12 * clam120 - cchi12 * slam120,
893 cchi12 * clam120 + schi12 * slam120);
895 (sig12 + (
E.deltaH(ssig2, csig2, dn2) -
E.deltaH(ssig1, csig1, dn1)));
896 lam12 = eta + deta12;
898 domg12 = deta12 +
atan2(schi12 * comg12 - cchi12 * somg12,
899 cchi12 * comg12 + schi12 * somg12);
902 dlam12 = - 2 *
_f1 * dn1 / sbet1;
905 Lengths(
E, sig12, ssig1, csig1, dn1, ssig2, csig2, dn2,
908 dlam12 *=
_f1 / (calp2 * cbet2);
920 for (
int l = 0;
l <
nC4_; ++
l) {