C++ • SVG Rendering • Transport Maps • Geographic Projection
Учебный проект: транспортный справочник с визуализацией маршрутов и остановок в SVG Язык: C++17 Формат вывода: SVG (статический + интерактивный режим)
Этот проект реализует транспортный справочник, который:
-
хранит данные об остановках и маршрутах
-
обрабатывает текстовые запросы
-
визуализирует маршруты и остановки в SVG
-
поддерживает:
- 🚌 карту одного маршрута
- 🚏 карту одной остановки с несколькими маршрутами
- 🧭 корректную геопроекцию
- 🧠 аккуратный развод линий “туда / обратно”
- ✨ эмодзи для наглядности
Проект разбит на 11 логических файлов, каждый отвечает за свою зону ответственности.
📦 transport_catalogue
├── main.cpp
├── transport_catalogue.h / .cpp
├── domain.h
├── geo.h
├── input_reader.h / .cpp
├── stat_reader.h / .cpp
├── map_renderer.h / .cpp
Проект разделён на 3 слоя:
┌───────────────┐
│ main.cpp │ ← orchestration / CLI
└───────▲───────┘
│
┌───────┴────────────┐
│ input / stat │ ← parsing + запросы
│ readers │
└───────▲────────────┘
│
┌───────┴────────────┐
│ transport_catalogue│ ← данные + логика
│ map_renderer │ ← SVG визуализация
└────────────────────┘
🚀 Точка входа
-
читает входные данные
-
выбирает режим (обычный / SVG / интерактивный)
-
связывает:
input_readertransport_cataloguestat_readermap_renderer
❗ Здесь нет логики — только управление потоком выполнения.
🧠 Сердце проекта
Отвечает за:
- хранение остановок и маршрутов
- связи между ними
- быстрый доступ по имени
- предотвращение дублирования данных
Использует:
unordered_map- указатели на доменные сущности
- строгую модель владения
📦 Доменные сущности
struct Stop { name, coordinates }
struct Bus { name, stops }- не содержит логики
- используется во всех модулях
- единый источник истины
🌍 География
- структура
Coordinates - вспомогательные функции
- используется в проекции SVG
📥 Парсер входных данных
- читает текстовый ввод
- добавляет данные в
TransportCatalogue - не знает ничего про SVG и вывод
📊 Обработка запросов
-
отвечает на запросы:
- информация о маршруте
- информация об остановке
-
вызывает
map_rendererпри SVG-запросах
🎨 SVG визуализация
Самый объёмный файл — и осознанно.
- SVG — это отдельная подсистема
- здесь сосредоточена вся геометрия
- логика сложная, но локализованная
- линии маршрута
- стрелки направления 👉
- автобусы 🚌
- остановки 🚏
- корректный масштаб
- шапка с названием маршрута
- несколько маршрутов разными цветами
- развод линий (чтобы не слипались)
- выделение выбранной остановки ⭐
- легенда маршрутов
- динамическая шапка
namespace transport_catalogue::render {
namespace detail {
// внутренняя кухня
}
}- скрывает вспомогательные типы
- не засоряет публичный API
- предотвращает конфликты имён
🧭 Проецирует lat/lng → x/y в SVG
- учитывает padding
- масштабирует карту
- предотвращает обрезание снизу
🎨 Стиль рисования маршрута
Позволяет:
- переиспользовать код
- легко менять толщину линий
- управлять расстоянием между “туда / обратно”
🛣 Общий движок рисования маршрутов
-
один код для:
- карты маршрута
- карты остановки
-
устраняет дублирование
-
корректно разводит двухсторонние маршруты
🚏 Остановки + подписи
- обычный режим
- выделение выбранной остановки
- единый стиль
📋 Шапка SVG
- белая подложка
- заголовок
- легенда маршрутов
- автоматически рассчитывает высоту
- 🚌 автобус на линии
- 👉 стрелка направления
- 🚏 остановка
- ⭐ выбранная остановка
- цвета маршрутов
- аккуратный развод линий
✅ Нет глобальной логики ✅ Нет дублирования алгоритмов ✅ Чёткие зоны ответственности ✅ Готово к расширению (zoom, интерактивность) ✅ Читаемо для ревью
Проект демонстрирует:
- аккуратную работу с namespace
- разделение логики и визуализации
- практическую геометрию
- осмысленный рефакторинг
- готовность к реальному использованию
Проект поддерживает два режима работы:
- 📄 Обычный (текстовый) — вывод статистики в stdout
- 🎨 Интерактивный (SVG) — визуализация маршрутов и остановок
Режим выбирается на этапе компиляции.
Без визуализации, только текстовые ответы на запросы
g++ -std=c++17 -O2 -Wall -Wextra -pedantic ^
main.cpp transport_catalogue.cpp input_reader.cpp stat_reader.cpp ^
-o transport_catalogue.exe
transport_catalogue.exe < input.txt > output.txt
📌 В этом режиме:
-
читается
input.txt -
результат выводится в
output.txt -
поддерживаются stat-запросы:
Bus XStop X
Включает визуализацию маршрутов и остановок
g++ -std=c++17 -O2 -Wall -Wextra -pedantic ^
-DINTERACTIVE ^
main.cpp transport_catalogue.cpp input_reader.cpp stat_reader.cpp map_renderer.cpp ^
-o transport_catalogue.exe
⚠️ Важно: в этом режиме обязательно подключаетсяmap_renderer.cpp
transport_catalogue.exe input.txt
📌 В отличие от обычного режима:
- ввод читается из файла
- дальнейшее взаимодействие — через stdin (команды)
После запуска:
1️⃣ Сначала выводится список маршрутов 2️⃣ Затем выводится список остановок:
- номер
- название
- количество маршрутов, проходящих через неё
После этого программа ждёт команды пользователя.
| Команда | Что делает |
|---|---|
B <номер> |
🚌 SVG-карта маршрута по номеру |
S <номер> |
🚏 SVG-карта остановки со всеми маршрутами |
<имя автобуса> |
🚌 SVG маршрута по имени (как в предыдущих заданиях) |
Q |
❌ выход из программы |
- линия маршрута
- стрелки направления 👉
- иконки автобусов 🚌
- остановки 🚏
- масштабирование по размеру SVG
- заголовок с именем маршрута
- все маршруты через остановку (разные цвета)
- аккуратный развод линий “туда / обратно”
- выделение выбранной остановки ⭐
- легенда маршрутов
- динамическая шапка (не перекрывает карту)
-
добавлены stat-запросы:
Bus XStop X
-
выводится список маршрутов и остановок
-
можно выбирать SVG по номеру
-
поддерживается:
- один маршрут
- остановка со всеми маршрутами
-
улучшенная визуализация SVG
-
Режим выбирается на этапе компиляции, а не запуска
-
Код рендера (
map_renderer) полностью изолирован и не влияет на текстовый режим -
SVG можно:
- открыть в браузере
- вставить в HTML
- сохранить как файл
Проект поддерживает:
- 📄 текстовую обработку запросов
- 🎨 визуализацию транспортной сети
- 🧠 аккуратную архитектуру без дублирования
- 🔧 два режима без изменения кода