extends Node ## Простые часто используемые функции ## Производит преобразование из угла в радианы func radians(val: float): return (val * PI) / 180.0 ## Возвращает значение из байтового массива в 16 битное слово func ibytes_to_word(buf: PackedByteArray, i: int) -> int: return buf[i] + (buf[i + 1] * 256) ## Возвращает расстояние от центра координат до точки func hypot(x: float, y: float) -> float: return sqrt(x * x + y * y) ## Проверяет пересечение диапазона x1, x2 с диапазоном y1, y2 """ func is_overlap(x1, x2, y1, y2): return max(x1, y1) <= min(x2, y2) ## Производит преобразование из декартовой в полярную систему координат func pos_calc(freq: float, aoa: float, pos0: Vector2, r0: float, r1: float, f0: float, df: float): var r = ((freq - f0) / df) * r1 + r0 var aoa_rad = Tools.radians(aoa) - PI / 2.0 var x = cos(aoa_rad) * r + pos0.x var y = sin(aoa_rad) * r + pos0.y return Vector2(x, y) ## Отсекает значение до заданного диапазона func clip_value(val, val_min, val_max): if val < val_min: val = val_min if val > val_max: val = val_max return val ## Возвращает массив с именами членов класса func get_members_names(obj: Object) -> Array: var pl = obj.get_property_list() var names: = Array() for item in pl: names.append(item.name) return names ## Проверяет, что заданный массив похож на ip-адрес func assert_array_ipaddr(val: Array): """ Выкидывает исключение, если массив не содержит ip-адрес """ assert(val.size() == 2) assert(val[0] is String) assert(val[1] is int) assert((0 < val[1]) and (val[1] < 65536)) ## Преобразует декартовые координаты в полярные func map_dec_to_rad(pos0: Vector2, pos: Vector2) -> Vector2: var x1: float = pos.x - pos0.x var y1: float = pos.y - pos0.y var ang: float = (atan2(y1, x1) * 180.0) / PI return Vector2(ang + 360.0 * float(ang < 0.0), hypot(x1, y1)) ## Переводит значение val из диапазона a0...a1 в диапазон b0...b1 func map_range(val: float, a0: float, a1: float, b0: float, b1: float) -> float: return (((val - a0) * (b1 - b0)) / (a1 - a0)) + b0 ## Возвращает true, если val число, false - если иначе func type_is_num(val) -> bool: return (typeof(val) == TYPE_INT) or (typeof(val) == typeof(0.0)) ## Возвращает true, если точка внутри заданного полигона func is_point_in_polygon(pos: Vector2, p: PackedVector2Array) -> bool: var j: int = len(p) - 1 var odd_nodes: int = 0 for i in range(len(p)): if ((p[i].y < pos.y and p[j].y >= pos.y or p[j].y < pos.y and p[i].y >= pos.y) and (p[i].x <= pos.x or p[j].x <= pos.x)): odd_nodes ^= int((p[i].x + (pos.y - p[i].y) / (p[j].y - p[i].y) * (p[j].x - p[i].x) < pos.x)) j = i return odd_nodes > 0 ## Устанавливает слово в байтовом массиве ## buf - Байтовый массив ## index - Индекс младшего байта слова в массиве ## val - Значение слова для записи в батовый массив ## return - Ничего func set_wordi(buf: Array, index, val): buf[index] = val & 0xff buf[index + 1] = (val >> 8) & 0xff