Правила маршрутных соревнований (дельтапланеризм)

Кратко — то, что нужно для FR-35. Первоисточники: FAI Sporting Code Section 7A (Cross Country — общие правила, класс 1 = дельтапланы) и Section 7F (XC Scoring — формула GAP, геометрия заданий). Документы: S7F 2024, S7A 2021, разбор GAP — GlideComp, формат XCTrack — xctrack.org/Competition_Interfaces. Точные коэффициенты меняются от редакции к редакции — сверять с актуальной версией S7F.

Типы заданий

ТипСутьВ игре
Race to goal (гонка к гоулу)Одно или несколько стартовых окон (start gates). Время пилота отсчитывается от окна, после которого он стартовал, а не от своего пересечения.type: "race"
Elapsed time (по личному времени)Время — от своего пересечения старта до ESS.type: "elapsed"
Open distance (открытая дальность)Гоула нет (или он «в направлении»); считается пройденная дальность, пункты — необязательные.type: "open_distance"

Есть ещё варианты (distance with turnpoints, stopped task — остановленное задание с подсчётом по времени остановки), в игру пока не нужны.

Геометрия

  • Взлёт (takeoff) — точка старта полётов, окно взлёта (открыто/закрыто по времени).
  • Стартовый цилиндр (SSS, start of speed section): окружность вокруг точки, направление пересечения EXIT (вылет наружу — чаще всего вокруг взлёта) или ENTER (влёт внутрь — старт «в стороне»). Засчитывается только пересечение после открытия окна; пересёк раньше — надо вернуться и пересечь снова. Перестарт разрешён: засчитывается последнее корректное пересечение до следующего пункта.
  • Поворотные пункты (turnpoints) — цилиндры, берутся по порядку. Пункт взят, если в треке есть хотя бы одна точка внутри цилиндра с учётом допуска. Радиус задаёт судейская коллегия: у дельтапланов обычно 400 м … несколько км (400 м — практический минимум, меньше GPS/прибор не различают).
  • ESS (end of speed section) — конец скоростного участка: здесь останавливается время. Часто совпадает с гоулом.
  • Гоул (goal) — линия (перпендикулярна направлению от предыдущего пункта; пересекать по ходу задания) или цилиндр (у дельтапланов — чаще линия, у парапланов — цилиндр). Долететь до гоула нужно после ESS.
  • Допуск цилиндра: S7F — полоса вокруг границы, 0,1 % радиуса на Cat 1 и до 0,5 % на Cat 2, но не меньше 5 м (из-за разницы расчёта расстояний в приборах). В игре: cylinder_tolerance 0,5 % и min_tolerance_m 5 м (configs/tasks/settings.json).
  • Модель Земли: WGS84-эллипсоид (или FAI-сфера). В игре — локальная равнопромежуточная проекция (TerrainGeo), ошибка < 1 % на 160 км — для учебной игры достаточно, но при сравнении с XCTrack дистанции могут отличаться на десятки метров.

Оптимизированный маршрут

Дистанция задания — кратчайший путь от взлёта через все цилиндры по порядку к гоулу: ломаная касается каждого цилиндра (точки на окружностях или внутри, если прямая и так проходит через цилиндр), а в гоул приходит к ближнему краю. Оставшаяся дистанция в полёте считается так же, от текущего положения через невзятые пункты. Пройденная дистанция пилота, не долетевшего до гоула = дистанция задания − лучшая (минимальная) оставшаяся за полёт.

Алгоритм в игре (RouteOptimizer): покоординатный спуск — точка на каждом цилиндре по очереди ставится в оптимальное место при фиксированных соседях (если отрезок между соседями пересекает круг — точка на отрезке; иначе минимум |a−x|+|x−b| на дуге окружности золотым сечением), проходы повторяются до сходимости (< 5 см). Задача выпуклая, спуск на практике сходится к минимуму за несколько проходов (~0,1 мс на задание из 5 пунктов); тесты сравнивают с ручным расчётом и перебором.

Подсчёт (GAP, S7F — ориентир для экрана итога)

  • Доступные очки = 1000 × валидность задания (валидность старта × дистанции × времени).
  • Очки за дистанцию — пропорционально пройденной дистанции относительно лучшей; есть минимальная дистанция (обычно 5 км): взлетевший получает не меньше неё.
  • Очки за время (только долетевшим до ESS): доля скорости SF = max(0, 1 − ((t − t_min) / √t_min)^(5/6)), t в часах (показатель 5/6 — текущий S7F; в старых редакциях был 2/3).
  • Лидерские очки (leading) — за то, что летел впереди; очки за прилёт (arrival) — только у дельтапланов, по порядку прилёта на ESS.
  • Дельтапланы: долетел до ESS, но не до гоула — по умолчанию сохраняется 80 % очков за время и прилёт.

В одиночной игре соперников нет, поэтому игра показывает итог без очков: время скоростного участка (для долетевших) или пройденную дистанцию, и сравнивает с локальными рекордами (FR-37).

Формат XCTrack .xctsk (версия 1, JSON)

{
  "taskType": "CLASSIC", "version": 1, "earthModel": "WGS84",
  "turnpoints": [
    {"type": "TAKEOFF", "radius": 400,
     "waypoint": {"name": "T01", "description": "", "lat": 50.78, "lon": 86.23, "altSmoothed": 1780}},
    {"type": "SSS", "radius": 3000, "waypoint": {…}},
    {"radius": 1000, "waypoint": {…}},
    {"type": "ESS", "radius": 1000, "waypoint": {…}},
    {"radius": 200, "waypoint": {…}}
  ],
  "takeoff": {"timeOpen": "07:00:00Z", "timeClose": "09:00:00Z"},
  "sss": {"type": "RACE", "direction": "EXIT", "timeGates": ["08:00:00Z", "08:20:00Z"]},
  "goal": {"type": "LINE", "deadline": "12:00:00Z"}
}
  • type пункта: TAKEOFF / SSS / ESS или нет (обычный пункт); последний пункт — гоул.
  • sss.type: RACE / ELAPSED-TIME; sss.direction: ENTER / EXIT; goal.type: CYLINDER / LINE.
  • Время — строка HH:MM:SSZ (UTC); встречается в лишних кавычках ("\"12:00:00Z\"") — импорт снимает их.
  • Линия гоула: радиус пункта = половина длины линии, линия перпендикулярна направлению на предыдущий пункт.
  • Версия 2 — сжатый формат для QR-кодов (XCTSK: / XCTSKZ:, короткие ключи, polyline-координаты) — в игре пока не поддерживается.
  • Файлы заданий реальных соревнований публикуют организаторы (сайты соревнований, airtribune, XCTrack task server) — положить .xctsk в user://tasks/, и задание появится в списке (координаты должны попадать в загруженную локацию).