Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
ARV_calc_loc[0] = ARV_loc[0]
# Calculate areas and store in asas
FRV_area_loc[0] = 0
ARV_area_loc[0] = np.pi * (vmax **2 - vmin ** 2)
return
# Function qdrdist_matrix needs 4 vectors as input (lat1,lon1,lat2,lon2)
# To be efficient, calculate all qdr and dist in one function call
# Example with ntraf = 5: ind1 = [0,0,0,0,1,1,1,2,2,3]
# ind2 = [1,2,3,4,2,3,4,3,4,4]
# This way the qdrdist is only calculated once between every aircraft
# To get all combinations, use this function to get the indices
ind1, ind2 = qdrdist_matrix_indices(ntraf)
# Get absolute bearing [deg] and distance [nm]
# Not sure abs/rel, but qdr is defined from [-180,180] deg, w.r.t. North
[qdr, dist] = geo.qdrdist_matrix(lat[ind1], lon[ind1], lat[ind2], lon[ind2])
# Put result of function from matrix to ndarray
qdr = np.reshape(np.array(qdr), np.shape(ind1))
dist = np.reshape(np.array(dist), np.shape(ind1))
# SI-units from [deg] to [rad]
qdr = np.deg2rad(qdr)
# Get distance from [nm] to [m]
dist = dist * nm
# In LoS the VO can't be defined, act as if dist is on edge
dist[dist < hsepm] = hsepm
# Calculate vertices of Velocity Obstacle (CCW)
# These are still in relative velocity space, see derivation in appendix
# Half-angle of the Velocity obstacle [rad]
# Include safety margin
alpha = np.arcsin(hsepm / dist)
rawlabel += '%-8s' % acid[:8]
if actdata.show_lbl == 2:
if alt <= data.translvl:
rawlabel += '%-5d' % int(alt / ft + 0.5)
else:
rawlabel += 'FL%03d' % int(alt / ft / 100. + 0.5)
vsarrow = 30 if vs > 0.25 else 31 if vs < -0.25 else 32
rawlabel += '%1s %-8d' % (chr(vsarrow), int(cas / kts + 0.5))
else:
rawlabel += 16 * ' '
if inconf:
if actdata.ssd_conflicts:
selssd[i] = 255
color[i, :] = palette.conflict + (255,)
lat1, lon1 = geo.qdrpos(lat, lon, trk, tcpa * gs / nm)
cpalines[4 * confidx : 4 * confidx + 4] = [lat, lon, lat1, lon1]
confidx += 1
else:
# Get custom color if available, else default
rgb = palette.aircraft
if ingroup:
for groupmask, groupcolor in actdata.custgrclr.items():
if ingroup & groupmask:
rgb = groupcolor
break
rgb = actdata.custacclr.get(acid, rgb)
color[i, :] = tuple(rgb) + (255,)
# Check if aircraft is selected to show SSD
if actdata.ssd_all or acid in actdata.ssd_ownship:
selssd[i] = 255
# If pos is specified check for more and return closest
else:
idx = []
idx.append(i)
found = True
while i < len(self.wpid) - 1 and found:
try:
i = self.wpid.index(name, i + 1)
idx.append(i)
except:
found = False
if len(idx) == 1:
return idx[0]
else:
imin = idx[0]
dmin = geo.kwikdist(reflat, reflon, self.wplat[imin], self.wplon[imin])
for i in idx[1:]:
d = geo.kwikdist(reflat, reflon, self.wplat[i], self.wplon[i])
if d < dmin:
imin = i
dmin = d
return imin
# Radar mode
if not self.swnavdisp:
# Normal case
if self.lon1 > self.lon0:
sw = (lat > self.lat0) * (lat < self.lat1) * \
(lon > self.lon0) * (lon < self.lon1) == 1
# Wrap around:
else:
sw = (lat > self.lat0) * (lat < self.lat1) * \
((lon > self.lon0) + (lon < self.lon1)) == 1
# Else NAVDISP mode
else:
base = 30. * (self.lat1 - self.lat0)
dist = geo.latlondist(self.ndlat, self.ndlon, lat, lon) / nm
sw = dist < base
return sw
curarg = min(curarg, len(clickargs) - 2)
if curarg < totargs:
clicktype = clickargs[curarg]
if clicktype == "acid":
idx = findnearest(lat, lon, acdata.lat, acdata.lon)
if idx >= 0:
todisplay += acdata.id[idx] + " "
elif clicktype == "latlon":
todisplay += str(round(lat, 6)) + "," + str(round(lon, 6)) + " "
elif clicktype == "dist":
latref, lonref = float(args[1]), float(args[2])
todisplay += str(round(geo.kwikdist(latref, lonref, lat, lon), 6))
elif clicktype == "apt":
idx = findnearest(lat, lon, bs.navdb.aptlat, bs.navdb.aptlon)
if idx >= 0:
todisplay += bs.navdb.aptid[idx] + " "
elif clicktype == "wpinroute": # Find nearest waypoint in route
if acdata.id.count(args[0]) > 0:
itraf = acdata.id.index(args[0])
synerr = False
reflat = acdata.lat[itraf]
reflon = acdata.lon[itraf]
# The pygame version can get the route directly from traf
# otherwise the route is passed to this function
if route is None:
route = acdata.ap.route[itraf]
except:
return [-1]
# if no pos is specified, get first occurence
if not reflat < 99999.:
return [i]
# If pos is specified check for more and return closest
else:
idx = findall(self.wpid,name) # find indices of al occurences
if len(idx) == 1:
return [idx[0]]
else:
imin = idx[0]
dmin = geo.kwikdist(reflat, reflon, self.wplat[imin], self.wplon[imin])
for i in idx[1:]:
d = geo.kwikdist(reflat, reflon, self.wplat[i], self.wplon[i])
if d < dmin:
imin = i
dmin = d
# Find co-located
indices = [imin]
for i in idx:
if i!=imin:
dist = nm*geo.kwikdist(self.wplat[i], self.wplon[i], \
self.wplat[imin], self.wplon[imin])
if dist<=crit:
indices.append(i)
return indices
vreln, vrele = gsref * cos(trkref) - gsn, gsref * sin(trkref) - gse
# Relative velocity magnitude
vrel = sqrt(vreln * vreln + vrele * vrele)
# Relative travel distance to closest point of approach
drelcpa = tlosh * vrel + (0 if cpa > pzr else sqrt(pzr * pzr - cpa * cpa))
# Initial intruder distance
dist = sqrt(drelcpa * drelcpa + cpa * cpa)
# Rotation matrix diagonal and cross elements for distance vector
rd = drelcpa / dist
rx = cpa / dist
# Rotate relative velocity vector to obtain intruder bearing
brn = degrees(atan2(-rx * vreln + rd * vrele,
rd * vreln + rx * vrele))
# Calculate intruder lat/lon
aclat, aclon = geo.kwikpos(latref, lonref, brn, dist / nm)
# convert groundspeed to CAS, and track to heading
wn, we = self.wind.getdata(aclat, aclon, acalt)
tasn, tase = gsn - wn, gse - we
acspd = tas2cas(sqrt(tasn * tasn + tase * tase), acalt)
achdg = degrees(atan2(tase, tasn))
# Create and, when necessary, set vertical speed
self.create(1, actype, acalt, acspd, None, aclat, aclon, achdg, acid)
self.ap.selaltcmd(len(self.lat) - 1, altref, acvs)
self.vs[-1] = acvs