Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def _GenInverse(self, lat1, lon1, lat2, lon2, outmask):
"""Private: General version of the inverse problem"""
a12 = s12 = m12 = M12 = M21 = S12 = Math.nan # return vals
outmask &= Geodesic.OUT_MASK
# Compute longitude difference (AngDiff does this carefully). Result is
# in [-180, 180] but -180 is only for west-going geodesics. 180 is for
# east-going and meridional geodesics.
lon12, lon12s = Math.AngDiff(lon1, lon2)
# Make longitude difference positive.
lonsign = 1 if lon12 >= 0 else -1
# If very close to being on the same half-meridian, then make it so.
lon12 = lonsign * Math.AngRound(lon12)
lon12s = Math.AngRound((180 - lon12) - lonsign * lon12s)
lam12 = math.radians(lon12)
if lon12 > 90:
slam12, clam12 = Math.sincosd(lon12s); clam12 = -clam12
else:
slam12, clam12 = Math.sincosd(lon12)
# If really close to the equator, treat as on equator.
lat1 = Math.AngRound(Math.LatFix(lat1))
lat2 = Math.AngRound(Math.LatFix(lat2))
# Swap points so that point with higher (abs) latitude is point 1
# If one latitude is a nan, then it becomes lat1.
swapp = -1 if abs(lat1) < abs(lat2) else 1
if swapp < 0:
lonsign *= -1
lat2, lat1 = lat1, lat2
# in [-180, 180] but -180 is only for west-going geodesics. 180 is for
# east-going and meridional geodesics.
lon12, lon12s = Math.AngDiff(lon1, lon2)
# Make longitude difference positive.
lonsign = 1 if lon12 >= 0 else -1
# If very close to being on the same half-meridian, then make it so.
lon12 = lonsign * Math.AngRound(lon12)
lon12s = Math.AngRound((180 - lon12) - lonsign * lon12s)
lam12 = math.radians(lon12)
if lon12 > 90:
slam12, clam12 = Math.sincosd(lon12s); clam12 = -clam12
else:
slam12, clam12 = Math.sincosd(lon12)
# If really close to the equator, treat as on equator.
lat1 = Math.AngRound(Math.LatFix(lat1))
lat2 = Math.AngRound(Math.LatFix(lat2))
# Swap points so that point with higher (abs) latitude is point 1
# If one latitude is a nan, then it becomes lat1.
swapp = -1 if abs(lat1) < abs(lat2) else 1
if swapp < 0:
lonsign *= -1
lat2, lat1 = lat1, lat2
# Make lat1 <= 0
latsign = 1 if lat1 < 0 else -1
lat1 *= latsign
lat2 *= latsign
# Now we have
#
# 0 <= lon12 <= 180
# -90 <= lat1 <= 0
# lat1 <= lat2 <= -lat1
def _GenInverse(self, lat1, lon1, lat2, lon2, outmask):
"""Private: General version of the inverse problem"""
a12 = s12 = m12 = M12 = M21 = S12 = Math.nan # return vals
outmask &= Geodesic.OUT_MASK
# Compute longitude difference (AngDiff does this carefully). Result is
# in [-180, 180] but -180 is only for west-going geodesics. 180 is for
# east-going and meridional geodesics.
lon12, lon12s = Math.AngDiff(lon1, lon2)
# Make longitude difference positive.
lonsign = 1 if lon12 >= 0 else -1
# If very close to being on the same half-meridian, then make it so.
lon12 = lonsign * Math.AngRound(lon12)
lon12s = Math.AngRound((180 - lon12) - lonsign * lon12s)
lam12 = math.radians(lon12)
if lon12 > 90:
slam12, clam12 = Math.sincosd(lon12s); clam12 = -clam12
else:
slam12, clam12 = Math.sincosd(lon12)
# If really close to the equator, treat as on equator.
lat1 = Math.AngRound(Math.LatFix(lat1))
lat2 = Math.AngRound(Math.LatFix(lat2))
# Swap points so that point with higher (abs) latitude is point 1
# If one latitude is a nan, then it becomes lat1.
swapp = -1 if abs(lat1) < abs(lat2) else 1
if swapp < 0:
lonsign *= -1
lat2, lat1 = lat1, lat2
# Make lat1 <= 0
"""the latitude of the first point in degrees (readonly)"""
self.lon1 = lon1
"""the longitude of the first point in degrees (readonly)"""
if Math.isnan(salp1) or Math.isnan(calp1):
self.azi1 = Math.AngNormalize(azi1)
self.salp1, self.calp1 = Math.sincosd(Math.AngRound(azi1))
else:
self.azi1 = azi1
"""the azimuth at the first point in degrees (readonly)"""
self.salp1 = salp1
"""the sine of the azimuth at the first point (readonly)"""
self.calp1 = calp1
"""the cosine of the azimuth at the first point (readonly)"""
# real cbet1, sbet1
sbet1, cbet1 = Math.sincosd(Math.AngRound(lat1)); sbet1 *= self._f1
# Ensure cbet1 = +epsilon at poles
sbet1, cbet1 = Math.norm(sbet1, cbet1); cbet1 = max(Geodesic.tiny_, cbet1)
self._dn1 = math.sqrt(1 + geod._ep2 * Math.sq(sbet1))
# Evaluate alp0 from sin(alp1) * cos(bet1) = sin(alp0),
self._salp0 = self.salp1 * cbet1 # alp0 in [0, pi/2 - |bet1|]
# Alt: calp0 = hypot(sbet1, calp1 * cbet1). The following
# is slightly better (consider the case salp1 = 0).
self._calp0 = math.hypot(self.calp1, self.salp1 * sbet1)
# Evaluate sig with tan(bet1) = tan(sig1) * cos(alp1).
# sig = 0 is nearest northward crossing of equator.
# With bet1 = 0, alp1 = pi/2, we have sig1 = 0 (equatorial line).
# With bet1 = pi/2, alp1 = -pi, sig1 = pi/2
# With bet1 = -pi/2, alp1 = 0 , sig1 = -pi/2
# Evaluate omg1 with tan(omg1) = sin(alp0) * tan(sig1).
# With alp0 in (0, pi/2], quadrants for sig and omg coincide.
def _GenInverse(self, lat1, lon1, lat2, lon2, outmask):
"""Private: General version of the inverse problem"""
a12 = s12 = m12 = M12 = M21 = S12 = Math.nan # return vals
outmask &= Geodesic.OUT_MASK
# Compute longitude difference (AngDiff does this carefully). Result is
# in [-180, 180] but -180 is only for west-going geodesics. 180 is for
# east-going and meridional geodesics.
lon12, lon12s = Math.AngDiff(lon1, lon2)
# Make longitude difference positive.
lonsign = 1 if lon12 >= 0 else -1
# If very close to being on the same half-meridian, then make it so.
lon12 = lonsign * Math.AngRound(lon12)
lon12s = Math.AngRound((180 - lon12) - lonsign * lon12s)
lam12 = math.radians(lon12)
if lon12 > 90:
slam12, clam12 = Math.sincosd(lon12s); clam12 = -clam12
else:
slam12, clam12 = Math.sincosd(lon12)
# If really close to the equator, treat as on equator.
lat1 = Math.AngRound(Math.LatFix(lat1))
lat2 = Math.AngRound(Math.LatFix(lat2))
# Swap points so that point with higher (abs) latitude is point 1
# If one latitude is a nan, then it becomes lat1.
swapp = -1 if abs(lat1) < abs(lat2) else 1
if swapp < 0:
lonsign *= -1
lat2, lat1 = lat1, lat2
# Make lat1 <= 0