Доработка. Доработка__Получить_угол_места_для_помехи_из_параметров_цели
This commit is contained in:
@@ -642,29 +642,6 @@ class Tile:
|
||||
self.y = y0
|
||||
self.z = z0
|
||||
|
||||
# Возвращает расстояние в метрах между двумя точками на карте
|
||||
func haversine_m(lat1: float, lon1: float, lat2: float, lon2: float) -> float:
|
||||
# Радиус Земли в метрах
|
||||
const R: = 6372795.0
|
||||
# Преобразование градусов в радианы
|
||||
var rlat1: = deg_to_rad(lat1)
|
||||
var rlon1: = deg_to_rad(lon1)
|
||||
var rlat2: = deg_to_rad(lat2)
|
||||
var rlon2: = deg_to_rad(lon2)
|
||||
# вычисление длины большого круга
|
||||
var cl1: = cos(rlat1)
|
||||
var cl2: = cos(rlat2)
|
||||
var sl1: = sin(rlat1)
|
||||
var sl2: = sin(rlat2)
|
||||
var delta: = rlon2 - rlon1
|
||||
var cdelta: = cos(delta)
|
||||
var sdelta: = sin(delta)
|
||||
var y: = sqrt(pow(cl2 * sdelta, 2.0) + pow(cl1 * sl2 - sl1 * cl2 * cdelta, 2.0))
|
||||
var x: = sl1 * sl2 + cl1 * cl2 * cdelta
|
||||
var ad: = atan2(y, x)
|
||||
var dist: = ad * R
|
||||
return dist
|
||||
|
||||
|
||||
func remove_closest_dot(screen_pos: Vector2) -> bool:
|
||||
var closest_dot = find_at_screen_position(screen_pos)
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
class_name Iterfer extends Node
|
||||
|
||||
const default_um: = 15.0 ## Угол места по умолчанию
|
||||
|
||||
## Представление помехи.
|
||||
|
||||
## Режимы помехи.
|
||||
@@ -118,6 +120,7 @@ var resend_timeout: float = 1.0 ## Время повторной
|
||||
|
||||
signal send_ecms(time_now) ## Сигнал отправки помех, если настало время
|
||||
|
||||
var unit_nav: unit.Unit ## Навигация
|
||||
|
||||
## Сеанс помехи.
|
||||
class Interfer:
|
||||
@@ -223,7 +226,7 @@ func _ready() -> void:
|
||||
threats.connect('threats_resized', Callable(self, 'on_threats_resized'))
|
||||
threats.connect('threat_update', Callable(self, 'on_threats_update').bind(ecms))
|
||||
ProjectSettings.connect('settings_changed', on_settings_changed)
|
||||
var unit_nav: = network.get_unit_instance('навигация')
|
||||
unit_nav = network.get_unit_instance('навигация')
|
||||
unit_nav.connect('data_received', on_nav_data_received.bind(unit_caps))
|
||||
connect('send_ecms', Callable(self, 'on_send_ecms').bind(ecms, unit_caps))
|
||||
call_deferred('emit_signal', 'interfer_resized', ecms)
|
||||
@@ -286,6 +289,7 @@ func on_th_aoa_update(threats: Dictionary, ecms: Dictionary) -> void:
|
||||
if thrs[ecm_i] == th_id:
|
||||
var ecm = ecms[ecm_i]
|
||||
ecm.params['freq'] = thr.freq
|
||||
ecm.params['um'] = get_um(thr.lat, thr.lon, thr.alt)
|
||||
ecm.kni = fposmod(thr.aoa - course, 360)
|
||||
call_ecm_proc(ecm)
|
||||
if ecm.nmfs in gos_nmfs or prd.fs_caps_id[ecm.nmfs] in fs_closed:
|
||||
@@ -389,6 +393,7 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v
|
||||
var id = item.id
|
||||
param['freq'] = item.freq
|
||||
param['width'] = item.width * width_coef
|
||||
param['um'] = get_um(item.lat, item.lon, item.alt)
|
||||
if item.rparams.has('period'):
|
||||
param['period'] = item.rparams['period']
|
||||
if (item.rkrp != '') and item.fflags.rkrp and auto_enabled:
|
||||
@@ -409,6 +414,15 @@ func on_interfer_create(interfer_name, sel_threats, fs_arr, power, u, ecms) -> v
|
||||
interfer_create(u, interfer_name, ecms, param, kni, id, fs, SOURCE_INTERFER[1], power)
|
||||
|
||||
|
||||
## Возвращает угол места до заданной цели
|
||||
## [param lat] -
|
||||
## [param lon] -
|
||||
## [param alt] - высота
|
||||
func get_um(lat: float, lon: float, alt: float) -> float:
|
||||
var dist = tools.haversine_m(lat, lon, unit_nav.latlon.x, unit_nav.latlon.y)
|
||||
return rad_to_deg(atan(alt / dist)) if dist > 0.0 else default_um
|
||||
|
||||
|
||||
func on_interfer_rcv(interfer_params: Array, unit0, unit_caps, ecms) -> void:
|
||||
var err: bool = false
|
||||
var mode = interfer_params[0]
|
||||
@@ -472,7 +486,7 @@ func interfer_create(_u, interfer_name, ecms, param, kni, id, dict, source_inter
|
||||
ecm.params = param
|
||||
ecm.powp = power
|
||||
ecm.source_interfer = source_interfer
|
||||
ecm.um = param.get('um', 15.0) # Значение по умолчанию
|
||||
ecm.um = param.get('um', default_um) # Значение по умолчанию
|
||||
if source_interfer == SOURCE_INTERFER[0]:
|
||||
if thrs_dict.has(dict[ispp]):
|
||||
ecm.priority = thrs_dict[dict[ispp]].priority
|
||||
|
||||
@@ -13,6 +13,7 @@ class NaviSource extends unit.Unit:
|
||||
var data: = {} ## Принятые данные
|
||||
var source_addr: = [] ## Адрес отправителя
|
||||
const akng_mode = {0:'тестовый', 1:'основной', 2:'резервный', 3:'аварийный'}
|
||||
static var latlon: Vector2 ## Текущие координаты
|
||||
func _to_string() -> String:
|
||||
return String('NaviSource: %s %s' % [self.name, 'на связи' if online else 'отключен'])
|
||||
func _init(nm):
|
||||
@@ -40,8 +41,10 @@ class NaviSource extends unit.Unit:
|
||||
if flags & (1 << 1):
|
||||
data['k'] = rx_data.decode_float(8) # Курс, градусы (0.0 - Север)
|
||||
if flags & (1 << 2):
|
||||
data['latitude'] = float(rx_data.decode_s32(12) * 180) / pow_2_30 # Широта, градусы
|
||||
data['longitude'] = float(rx_data.decode_s32(16) * 180) / pow_2_30 # Долгота, градусы
|
||||
latlon.x = float(rx_data.decode_s32(12) * 180) / pow_2_30 # Широта, градусы
|
||||
latlon.y = float(rx_data.decode_s32(16) * 180) / pow_2_30 # Долгота, градусы
|
||||
data['latitude'] = latlon.x
|
||||
data['longitude'] = latlon.y
|
||||
if flags & (1 << 3):
|
||||
data['speed'] = rx_data.decode_float(20) # Скорость, м/с
|
||||
data['err'] = rx_data.decode_u16(24) #
|
||||
|
||||
@@ -197,6 +197,30 @@ func set_bits(v, a, m):
|
||||
return (~m) & v | a & m
|
||||
|
||||
|
||||
# Возвращает расстояние в метрах между двумя точками на карте
|
||||
func haversine_m(lat1: float, lon1: float, lat2: float, lon2: float) -> float:
|
||||
# Радиус Земли в метрах
|
||||
const R: = 6372795.0
|
||||
# Преобразование градусов в радианы
|
||||
var rlat1: = deg_to_rad(lat1)
|
||||
var rlon1: = deg_to_rad(lon1)
|
||||
var rlat2: = deg_to_rad(lat2)
|
||||
var rlon2: = deg_to_rad(lon2)
|
||||
# вычисление длины большого круга
|
||||
var cl1: = cos(rlat1)
|
||||
var cl2: = cos(rlat2)
|
||||
var sl1: = sin(rlat1)
|
||||
var sl2: = sin(rlat2)
|
||||
var delta: = rlon2 - rlon1
|
||||
var cdelta: = cos(delta)
|
||||
var sdelta: = sin(delta)
|
||||
var y: = sqrt(pow(cl2 * sdelta, 2.0) + pow(cl1 * sl2 - sl1 * cl2 * cdelta, 2.0))
|
||||
var x: = sl1 * sl2 + cl1 * cl2 * cdelta
|
||||
var ad: = atan2(y, x)
|
||||
var dist: = ad * R
|
||||
return dist
|
||||
|
||||
|
||||
func fill_files_table(tbl: table, folder: String, rows_types: Array):
|
||||
var dir: = DirAccess.open(folder)
|
||||
if dir == null:
|
||||
|
||||
Reference in New Issue
Block a user