8 package net.sf.geographiclib;
102 private double _a, _f, _b, _c2, _f1, _salp0, _calp0, _k2,
103 _salp1, _calp1, _ssig1, _csig1, _dn1, _stau1, _ctau1, _somg1, _comg1,
104 _A1m1, _A2m1, _A3c, _B11, _B21, _B31, _A4, _B41;
107 private double _C1a[], _C1pa[], _C2a[], _C3a[],
128 double lat1,
double lon1,
double azi1) {
178 double lat1,
double lon1,
double azi1,
184 salp1 =
p.first; calp1 =
p.second; }
185 LineInit(
g, lat1, lon1, azi1, salp1, calp1, caps);
189 double lat1,
double lon1,
190 double azi1,
double salp1,
double calp1,
203 _azi1 = azi1; _salp1 = salp1; _calp1 = calp1;
206 sbet1 = _f1 *
p.first; cbet1 =
p.second; }
210 _dn1 = Math.sqrt(1 +
g._ep2 *
GeoMath.
sq(sbet1));
213 _salp0 = _salp1 * cbet1;
226 _ssig1 = sbet1; _somg1 = _salp0 * sbet1;
227 _csig1 = _comg1 = sbet1 != 0 || _calp1 != 0 ? cbet1 * _calp1 : 1;
229 _ssig1 =
p.first; _csig1 =
p.second; }
233 double eps = _k2 / (2 * (1 + Math.sqrt(1 + _k2)) + _k2);
240 double s = Math.sin(_B11),
c = Math.cos(_B11);
242 _stau1 = _ssig1 *
c + _csig1 *
s;
243 _ctau1 = _csig1 *
c - _ssig1 *
s;
249 _C1pa =
new double[
nC1p_ + 1];
254 _C2a =
new double[
nC2_ + 1];
261 _C3a =
new double[
nC3_];
263 _A3c = -_f * _salp0 *
g.A3f(eps);
268 _C4a =
new double[
nC4_];
277 double lat1,
double lon1,
278 double azi1,
double salp1,
double calp1,
279 int caps,
boolean arcmode,
double s13_a13) {
280 LineInit(
g, lat1, lon1, azi1, salp1, calp1, caps);
335 return Position(
false, s12, outmask);
375 return Position(
true, a12, outmask);
438 double sig12, ssig12, csig12, B12 = 0, AB1 = 0;
442 sig12 = Math.toRadians(s12_a12);
444 ssig12 =
p.first; csig12 =
p.second; }
449 tau12 = s12_a12 / (_b * (1 + _A1m1)),
454 _stau1 *
c + _ctau1 *
s,
455 _ctau1 *
c - _stau1 *
s,
457 sig12 = tau12 - (B12 - _B11);
458 ssig12 = Math.sin(sig12); csig12 = Math.cos(sig12);
459 if (Math.abs(_f) > 0.01) {
483 ssig2 = _ssig1 * csig12 + _csig1 * ssig12,
484 csig2 = _csig1 * csig12 - _ssig1 * ssig12;
486 double serr = (1 + _A1m1) * (sig12 + (B12 - _B11)) - s12_a12 / _b;
487 sig12 = sig12 - serr / Math.sqrt(1 + _k2 *
GeoMath.
sq(ssig2));
488 ssig12 = Math.sin(sig12); csig12 = Math.cos(sig12);
491 r.
a12 = Math.toDegrees(sig12);
494 double ssig2, csig2, sbet2, cbet2, salp2, calp2;
496 ssig2 = _ssig1 * csig12 + _csig1 * ssig12;
497 csig2 = _csig1 * csig12 - _ssig1 * ssig12;
498 double dn2 = Math.sqrt(1 + _k2 *
GeoMath.
sq(ssig2));
501 if (arcmode || Math.abs(_f) > 0.01)
503 AB1 = (1 + _A1m1) * (B12 - _B11);
506 sbet2 = _calp0 * ssig2;
513 salp2 = _salp0; calp2 = _calp0 * csig2;
516 r.
s12 = _b * ((1 + _A1m1) * sig12 + AB1);
520 double somg2 = _salp0 * ssig2, comg2 = csig2,
525 - (Math.atan2( ssig2, csig2) - Math.atan2( _ssig1, _csig1))
526 + (Math.atan2(
E*somg2, comg2) - Math.atan2(
E*_somg1, _comg1)))
527 : Math.atan2(somg2 * _comg1 - comg2 * _somg1,
528 comg2 * _comg1 + somg2 * _somg1);
529 double lam12 = omg12 + _A3c *
532 double lon12 = Math.toDegrees(lam12);
547 AB2 = (1 + _A2m1) * (B22 - _B21),
548 J12 = (_A1m1 - _A2m1) * sig12 + (AB1 - AB2);
552 r.
m12 = _b * ((dn2 * (_csig1 * ssig2) - _dn1 * (_ssig1 * csig2))
553 - _csig1 * csig2 * J12);
555 double t = _k2 * (ssig2 - _ssig1) * (ssig2 + _ssig1) / (_dn1 + dn2);
556 r.
M12 = csig12 + (
t * ssig2 - csig2 * J12) * _ssig1 / _dn1;
557 r.
M21 = csig12 - (
t * _ssig1 - _csig1 * J12) * ssig2 / dn2;
564 double salp12, calp12;
565 if (_calp0 == 0 || _salp0 == 0) {
567 salp12 = salp2 * _calp1 - calp2 * _salp1;
568 calp12 = calp2 * _calp1 + salp2 * _salp1;
578 salp12 = _calp0 * _salp0 *
579 (csig12 <= 0 ? _csig1 * (1 - csig12) + ssig12 * _ssig1 :
580 ssig12 * (_csig1 * ssig12 / (1 + csig12) + _ssig1));
583 r.
S12 = _c2 * Math.atan2(salp12, calp12) + _A4 * (B42 - _B41);
613 void SetArc(
double a13) {
652 {
return Init() ? _lon1 : Double.NaN; }
658 {
return Init() ? _azi1 : Double.NaN; }
665 return new Pair(
Init() ? _salp1 : Double.NaN,
666 Init() ? _calp1 : Double.NaN);
683 return new Pair(
Init() ? _salp0 : Double.NaN,
684 Init() ? _calp0 : Double.NaN);
701 {
return Init() ?
_a : Double.NaN; }
708 {
return Init() ? _f : Double.NaN; }
722 return (
_caps & testcaps) == testcaps;
734 {
return Init() ? (arcmode ?
_a13 : _s13) : Double.NaN; }