Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
lon12 = lon12 - 360 * math.floor(lon12/360 + 0.5)
lon2 = Geodesic.AngNormalize(self._lon1 + lon12)
if outmask & Geodesic.LATITUDE:
lat2 = math.atan2(sbet2, self._f1 * cbet2) / Math.degree
if outmask & Geodesic.AZIMUTH:
# minus signs give range [-180, 180). 0- converts -0 to +0.
azi2 = 0 - math.atan2(-salp2, calp2) / Math.degree
if outmask & (Geodesic.REDUCEDLENGTH | Geodesic.GEODESICSCALE):
ssig1sq = Math.sq(self._ssig1)
ssig2sq = Math.sq( ssig2)
w1 = math.sqrt(1 + self._k2 * ssig1sq)
w2 = math.sqrt(1 + self._k2 * ssig2sq)
B22 = Geodesic.SinCosSeries(True, ssig2, csig2, self._C2a, Geodesic.nC2_)
AB2 = (1 + self._A2m1) * (B22 - self._B21)
J12 = (self._A1m1 - self._A2m1) * sig12 + (AB1 - AB2)
if outmask & Geodesic.REDUCEDLENGTH:
# Add parens around (_csig1 * ssig2) and (_ssig1 * csig2) to ensure
# accurate cancellation in the case of coincident points.
m12 = self._b * ((w2 * (self._csig1 * ssig2) -
w1 * (self._ssig1 * csig2))
- self._csig1 * csig2 * J12)
if outmask & Geodesic.GEODESICSCALE:
M12 = csig12 + (self._k2 * (ssig2sq - ssig1sq) * ssig2 / (w1 + w2)
- csig2 * J12) * self._ssig1 / w1
M21 = csig12 - (self._k2 * (ssig2sq - ssig1sq) * self._ssig1 / (w1 + w2)
- self._csig1 * J12) * ssig2 / w2
if outmask & Geodesic.AREA:
B42 = Geodesic.SinCosSeries(False, ssig2, csig2, self._C4a, Geodesic.nC4_)
somg2 = self._salp0 * ssig2; comg2 = csig2 # No need to normalize
# tan(alp0) = cos(sig2)*tan(alp2)
salp2 = self._salp0; calp2 = self._calp0 * csig2 # No need to normalize
# omg12 = omg2 - omg1
omg12 = math.atan2(somg2 * self._comg1 - comg2 * self._somg1,
comg2 * self._comg1 + somg2 * self._somg1)
if outmask & Geodesic.DISTANCE:
if arcmode:
s12 = self._b * ((1 + self._A1m1) * sig12 + AB1)
else:
s12 = s12_a12
if outmask & Geodesic.LONGITUDE:
lam12 = omg12 + self._A3c * (
sig12 + (Geodesic.SinCosSeries(True, ssig2, csig2,
self._C3a, Geodesic.nC3_-1)
- self._B31))
lon12 = lam12 / Math.degree
# Can't use AngNormalize because longitude might have wrapped multiple
# times.
lon12 = lon12 - 360 * math.floor(lon12/360 + 0.5)
lon2 = Geodesic.AngNormalize(self._lon1 + lon12)
if outmask & Geodesic.LATITUDE:
lat2 = math.atan2(sbet2, self._f1 * cbet2) / Math.degree
if outmask & Geodesic.AZIMUTH:
# minus signs give range [-180, 180). 0- converts -0 to +0.
azi2 = 0 - math.atan2(-salp2, calp2) / Math.degree
if outmask & (Geodesic.REDUCEDLENGTH | Geodesic.GEODESICSCALE):
if self._caps & Geodesic.CAP_C1p:
self._C1pa = list(range(Geodesic.nC1p_ + 1))
Geodesic.C1pf(eps, self._C1pa)
if self._caps & Geodesic.CAP_C2:
self._A2m1 = Geodesic.A2m1f(eps)
self._C2a = list(range(Geodesic.nC2_ + 1))
Geodesic.C2f(eps, self._C2a)
self._B21 = Geodesic.SinCosSeries(
True, self._ssig1, self._csig1, self._C2a, Geodesic.nC2_)
if self._caps & Geodesic.CAP_C3:
self._C3a = list(range(Geodesic.nC3_))
geod.C3f(eps, self._C3a)
self._A3c = -self._f * self._salp0 * geod.A3f(eps)
self._B31 = Geodesic.SinCosSeries(
True, self._ssig1, self._csig1, self._C3a, Geodesic.nC3_-1)
if self._caps & Geodesic.CAP_C4:
self._C4a = list(range(Geodesic.nC4_))
geod.C4f(self._k2, self._C4a)
# Multiplier = a^2 * e^2 * cos(alpha0) * sin(alpha0)
self._A4 = Math.sq(self._a) * self._calp0 * self._salp0 * geod._e2
self._B41 = Geodesic.SinCosSeries(
False, self._ssig1, self._csig1, self._C4a, Geodesic.nC4_)
# tau2 = tau1 + tau12
B12 = - Geodesic.SinCosSeries(True, self._stau1 * c + self._ctau1 * s,
self._ctau1 * c - self._stau1 * s,
self._C1pa, Geodesic.nC1p_)
sig12 = tau12 - (B12 - self._B11)
ssig12 = math.sin(sig12); csig12 = math.cos(sig12)
# real omg12, lam12, lon12
# real ssig2, csig2, sbet2, cbet2, somg2, comg2, salp2, calp2
# sig2 = sig1 + sig12
ssig2 = self._ssig1 * csig12 + self._csig1 * ssig12
csig2 = self._csig1 * csig12 - self._ssig1 * ssig12
if outmask & (
Geodesic.DISTANCE | Geodesic.REDUCEDLENGTH | Geodesic.GEODESICSCALE):
if arcmode:
B12 = Geodesic.SinCosSeries(True, ssig2, csig2,
self._C1a, Geodesic.nC1_)
AB1 = (1 + self._A1m1) * (B12 - self._B11)
# sin(bet2) = cos(alp0) * sin(sig2)
sbet2 = self._calp0 * ssig2
# Alt: cbet2 = hypot(csig2, salp0 * ssig2)
cbet2 = math.hypot(self._salp0, self._calp0 * csig2)
if cbet2 == 0:
# I.e., salp0 = 0, csig2 = 0. Break the degeneracy in this case
cbet2 = csig2 = Geodesic.tiny_
# tan(omg2) = sin(alp0) * tan(sig2)
somg2 = self._salp0 * ssig2; comg2 = csig2 # No need to normalize
# tan(alp0) = cos(sig2)*tan(alp2)
salp2 = self._salp0; calp2 = self._calp0 * csig2 # No need to normalize
# omg12 = omg2 - omg1
omg12 = math.atan2(somg2 * self._comg1 - comg2 * self._somg1,
comg2 * self._comg1 + somg2 * self._somg1)
if sbet1 != 0 or self._calp1 != 0:
self._csig1 = self._comg1 = cbet1 * self._calp1
else:
self._csig1 = self._comg1 = 1.0
# sig1 in (-pi, pi]
self._ssig1, self._csig1 = Geodesic.SinCosNorm(self._ssig1, self._csig1)
self._somg1, self._comg1 = Geodesic.SinCosNorm(self._somg1, self._comg1)
self._k2 = Math.sq(self._calp0) * geod._ep2
eps = self._k2 / (2 * (1 + math.sqrt(1 + self._k2)) + self._k2)
if self._caps & Geodesic.CAP_C1:
self._A1m1 = Geodesic.A1m1f(eps)
self._C1a = list(range(Geodesic.nC1_ + 1))
Geodesic.C1f(eps, self._C1a)
self._B11 = Geodesic.SinCosSeries(
True, self._ssig1, self._csig1, self._C1a, Geodesic.nC1_)
s = math.sin(self._B11); c = math.cos(self._B11)
# tau1 = sig1 + B11
self._stau1 = self._ssig1 * c + self._csig1 * s
self._ctau1 = self._csig1 * c - self._ssig1 * s
# Not necessary because C1pa reverts C1a
# _B11 = -SinCosSeries(true, _stau1, _ctau1, _C1pa, nC1p_)
if self._caps & Geodesic.CAP_C1p:
self._C1pa = list(range(Geodesic.nC1p_ + 1))
Geodesic.C1pf(eps, self._C1pa)
if self._caps & Geodesic.CAP_C2:
self._A2m1 = Geodesic.A2m1f(eps)
self._C2a = list(range(Geodesic.nC2_ + 1))
Geodesic.C2f(eps, self._C2a)
self._B21 = Geodesic.SinCosSeries(
True, self._ssig1, self._csig1, self._C2a, Geodesic.nC2_)
if self._caps & Geodesic.CAP_C3:
self._C3a = list(range(Geodesic.nC3_))
geod.C3f(eps, self._C3a)
self._A3c = -self._f * self._salp0 * geod.A3f(eps)
self._B31 = Geodesic.SinCosSeries(
True, self._ssig1, self._csig1, self._C3a, Geodesic.nC3_-1)
if self._caps & Geodesic.CAP_C4:
self._C4a = list(range(Geodesic.nC4_))
geod.C4f(self._k2, self._C4a)
# Multiplier = a^2 * e^2 * cos(alpha0) * sin(alpha0)
self._A4 = Math.sq(self._a) * self._calp0 * self._salp0 * geod._e2
self._B41 = Geodesic.SinCosSeries(
False, self._ssig1, self._csig1, self._C4a, Geodesic.nC4_)
s12a = abs(s12_a12)
s12a -= 180 * math.floor(s12a / 180)
if s12a == 0:
ssig12 = 0.0
else:
ssig12 = math.sin(sig12)
if s12a == 90:
csig12 = 0.0
else:
csig12 = math.cos(sig12)
else:
# Interpret s12_a12 as distance
tau12 = s12_a12 / (self._b * (1 + self._A1m1))
s = math.sin(tau12); c = math.cos(tau12)
# tau2 = tau1 + tau12
B12 = - Geodesic.SinCosSeries(True, self._stau1 * c + self._ctau1 * s,
self._ctau1 * c - self._stau1 * s,
self._C1pa, Geodesic.nC1p_)
sig12 = tau12 - (B12 - self._B11)
ssig12 = math.sin(sig12); csig12 = math.cos(sig12)
# real omg12, lam12, lon12
# real ssig2, csig2, sbet2, cbet2, somg2, comg2, salp2, calp2
# sig2 = sig1 + sig12
ssig2 = self._ssig1 * csig12 + self._csig1 * ssig12
csig2 = self._csig1 * csig12 - self._ssig1 * ssig12
if outmask & (
Geodesic.DISTANCE | Geodesic.REDUCEDLENGTH | Geodesic.GEODESICSCALE):
if arcmode:
B12 = Geodesic.SinCosSeries(True, ssig2, csig2,
self._C1a, Geodesic.nC1_)
AB1 = (1 + self._A1m1) * (B12 - self._B11)
AB2 = (1 + self._A2m1) * (B22 - self._B21)
J12 = (self._A1m1 - self._A2m1) * sig12 + (AB1 - AB2)
if outmask & Geodesic.REDUCEDLENGTH:
# Add parens around (_csig1 * ssig2) and (_ssig1 * csig2) to ensure
# accurate cancellation in the case of coincident points.
m12 = self._b * ((w2 * (self._csig1 * ssig2) -
w1 * (self._ssig1 * csig2))
- self._csig1 * csig2 * J12)
if outmask & Geodesic.GEODESICSCALE:
M12 = csig12 + (self._k2 * (ssig2sq - ssig1sq) * ssig2 / (w1 + w2)
- csig2 * J12) * self._ssig1 / w1
M21 = csig12 - (self._k2 * (ssig2sq - ssig1sq) * self._ssig1 / (w1 + w2)
- self._csig1 * J12) * ssig2 / w2
if outmask & Geodesic.AREA:
B42 = Geodesic.SinCosSeries(False, ssig2, csig2, self._C4a, Geodesic.nC4_)
# real salp12, calp12
if self._calp0 == 0 or self._salp0 == 0:
# alp12 = alp2 - alp1, used in atan2 so no need to normalized
salp12 = salp2 * self._calp1 - calp2 * self._salp1
calp12 = calp2 * self._calp1 + salp2 * self._salp1
# The right thing appears to happen if alp1 = +/-180 and alp2 = 0, viz
# salp12 = -0 and alp12 = -180. However this depends on the sign being
# attached to 0 correctly. The following ensures the correct behavior.
if salp12 == 0 and calp12 < 0:
salp12 = Geodesic.tiny_ * self._calp1
calp12 = -1
else:
# tan(alp) = tan(alp0) * sec(sig)
# tan(alp2-alp1) = (tan(alp2) -tan(alp1)) / (tan(alp2)*tan(alp1)+1)
# = calp0 * salp0 * (csig1-csig2) / (salp0^2 + calp0^2 * csig1*csig2)
# If csig12 > 0, write