Skip to content

Use Case #12: Горное Время ⏱️ (Правило Найсмита)

1. Жизненная ситуация (Боль пользователя)

Представь: Неопытный турист рисует трек на 10 км. Глупый сайт делит 10 км на 5 км/ч и радостно пишет: «Время в пути: 2 часа». Турист радуется: "Класс! Выйду в 16:00, к 18:00 буду на месте". Но эти 10 км идут круто в гору (набор высоты 1000 метров). В реальности скорость падает до 1-2 км/ч. Наступает 20:00. В горах резко темнеет, становится холодно. Турист в панике звонит спасателям. Сайт наврал и пообещал легкую прогулку по парку, забыв про гравитацию.


2. Как это ДОЛЖНО работать у тебя (UX-Магия)

Сайт должен вести себя как суровый, честный горный проводник. Каждый метр вверх — это потерянное время и силы.

Сценарий (Что видит юзер):

  1. В панели статистики крупно горит блок: ⏱️ Расчетное время.
  2. Магия в том, что время разбито на две понятные строчки:
    • 🚶‍♂️ Базовое время (по прямой): 2 ч. 00 мин.
    • ⛰️ Горный штраф (за подъем): + 1 ч. 40 мин.
    • Итоговое время: 3 часа 40 минут.
  3. Юзер смотрит на честные почти 4 часа, понимает, что до темноты не успеет, и переносит старт на утро. Мы только что спасли его здоровье.

3. СЕКРЕТ ДЛЯ ПРОГРАММИСТА (Формула Найсмита)

Здесь не нужен сложный ИИ. Альпинист Уильям Найсмит придумал формулу еще в 1892 году. Именно её используют спасатели и серьезные сервисы (вроде Komoot).

Алгоритм (Правило Найсмита):

  • Шаг 1 (База по горизонтали): Считаем плоскую скорость (например, пешком 5 км/ч). 10 км / 5 = 120 минут (2 часа).
  • Шаг 2 (Штраф за вертикаль): Сайт из графика высот знает суммарный набор высоты (например, 1000 м). Правило: На каждые 100 метров набора высоты ТУПО добавляем 10 минут штрафного времени!
  • Шаг 3 (Математика): 1000 м / 100 = 10 раз. Умножаем 10 * 10 мин = 100 минут (1 час 40 минут) штрафа!
  • Шаг 4 (Итог): 120 минут + 100 минут = 3 часа 40 минут. Выводим на экран. (Для велосипедистов: базовая скорость выше (например 15-20 км/ч), а штраф за высоту меньше: +3-4 минуты на каждые 100 метров).

4. ВАЖНАЯ ЛОВУШКА (Спуск — это не отдых!)

Смертельная ошибка программиста: "Если в гору идем медленно, значит с горы побежим быстро, давай ВЫЧИТАТЬ время на спусках!". Если код начнет отнимать время, он убьет юзера. На крутом спуске человек не бежит, он аккуратно сползает по камням. Скорость на спуске часто такая же медленная. ✅ Правило для кода: В формуле Найсмита мы учитываем ТОЛЬКО подъем (Набор высоты). Спуск (Потерю высоты) мы НИКОГДА не вычитаем! Спуск считается просто как ровная плоская дорога (только Шаг 1).


5. ЭКСПОРТ (Инъекция Темноты 🌙 — СУПЕР ФИЧА!)

Этого нет ни у одного конкурента!

Фича "Точка Темноты":

  1. В интерфейсе есть окошко: [ Во сколько вы стартуете? ]. Юзер пишет: 14:00.
  2. Сайт делает невидимый запрос к погодному API (Open-Meteo из Базы Ветра) и спрашивает: "Во сколько сегодня закат в этих координатах?". Ответ: 18:00.
  3. Сайт понимает: световой день = 4 часа.
  4. Тайм-маппинг: Алгоритм "бежит" по графику маршрута, суммируя время по Найсмиту. Он находит точную координату, где накопится ровно 4 часа (например, на 7-м километре). Дальше наступит кромешная тьма.
  5. Магия GPX: При генерации файла код САМ ставит на 7-м километре флажок (<wpt>) с текстом: ⚠️ 18:00 - ЗДЕСЬ СТЕМНЕЕТ!.

В лесу навигатор на руке издает громкий ПИСК. Юзер видит предупреждение о темноте, оглядывается, находит ровную полянку и понимает: "Дальше на скалу в темноте я не полезу, ставлю палатку здесь". Ты подарил юзеру личного ангела-хранителя!


Эпики и Задачи

Epic 1: Калькулятор Найсмита (Ядро)

  • Task 1.1: Создать класс NaismithCalculator.ts.
  • Task 1.2: Вычислять общий elevationGain (суммируя ТОЛЬКО положительные дельты высот между точками трека).
  • Task 1.3: Реализовать конфигурацию профилей:
    • hike: база 5 км/ч, штраф +10 мин / 100м
    • bike: база 15 км/ч, штраф +4 мин / 100м

Epic 2: UI и Декомпозиция времени

  • Task 2.1: Обновить панель статистики маршрута, разделив "Время" на: "Базовое" и "Горный штраф".
  • Task 2.2: Добавить UI-контрол Start Time (связанный с Date/Time пикером из модуля Ветра).

Epic 3: Симулятор Темноты (Time-Mapping)

  • Task 3.1: При получении прогноза погоды (Epic Ветра) извлекать параметр sunset для координат старта.
  • Task 3.2: Создать маппер, который итерируется по сегментам трека, накапливая accumulatedTime (по Найсмиту). Вернуть индекс/координату точки, где startTime + accumulatedTime >= sunsetTime.

Epic 4: Экспорт GPX (Ангел-хранитель)

  • Task 4.1: Если "Точка Темноты" найдена и она не совпадает с финишем трека, принудительно инжектить <wpt> объект в GPX билдер с текстом ⚠️ 18:00 СТЕМНЕЕТ (учитывая жесткий лимит символов).