Skip to content

amanzhola/cpp-transport-catalogue1

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

66 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

C++ • SVG Rendering • Transport Maps • Geographic Projection

🚌 Transport Catalogue — SVG Renderer

Учебный проект: транспортный справочник с визуализацией маршрутов и остановок в SVG Язык: C++17 Формат вывода: SVG (статический + интерактивный режим)


📌 Описание проекта

Этот проект реализует транспортный справочник, который:

  • хранит данные об остановках и маршрутах

  • обрабатывает текстовые запросы

  • визуализирует маршруты и остановки в SVG

  • поддерживает:

    • 🚌 карту одного маршрута
    • 🚏 карту одной остановки с несколькими маршрутами
    • 🧭 корректную геопроекцию
    • 🧠 аккуратный развод линий “туда / обратно”
    • ✨ эмодзи для наглядности

Проект разбит на 11 логических файлов, каждый отвечает за свою зону ответственности.


🗂 Структура проекта (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 визуализация
└────────────────────┘

📄 Описание файлов

1️⃣ main.cpp

🚀 Точка входа

  • читает входные данные

  • выбирает режим (обычный / SVG / интерактивный)

  • связывает:

    • input_reader
    • transport_catalogue
    • stat_reader
    • map_renderer

❗ Здесь нет логики — только управление потоком выполнения.


2️⃣ transport_catalogue.h / .cpp

🧠 Сердце проекта

Отвечает за:

  • хранение остановок и маршрутов
  • связи между ними
  • быстрый доступ по имени
  • предотвращение дублирования данных

Использует:

  • unordered_map
  • указатели на доменные сущности
  • строгую модель владения

3️⃣ domain.h

📦 Доменные сущности

struct Stop { name, coordinates }
struct Bus  { name, stops }
  • не содержит логики
  • используется во всех модулях
  • единый источник истины

4️⃣ geo.h

🌍 География

  • структура Coordinates
  • вспомогательные функции
  • используется в проекции SVG

5️⃣ input_reader.h / .cpp

📥 Парсер входных данных

  • читает текстовый ввод
  • добавляет данные в TransportCatalogue
  • не знает ничего про SVG и вывод

6️⃣ stat_reader.h / .cpp

📊 Обработка запросов

  • отвечает на запросы:

    • информация о маршруте
    • информация об остановке
  • вызывает map_renderer при SVG-запросах


7️⃣ map_renderer.h / .cpp

🎨 SVG визуализация

Самый объёмный файл — и осознанно.

Почему так?

  • SVG — это отдельная подсистема
  • здесь сосредоточена вся геометрия
  • логика сложная, но локализованная

🖼 Что умеет SVG-рендерер

🚌 Карта маршрута

  • линии маршрута
  • стрелки направления 👉
  • автобусы 🚌
  • остановки 🚏
  • корректный масштаб
  • шапка с названием маршрута

🚏 Карта остановки

  • несколько маршрутов разными цветами
  • развод линий (чтобы не слипались)
  • выделение выбранной остановки ⭐
  • легенда маршрутов
  • динамическая шапка

🧩 Внутренняя структура map_renderer.cpp

namespace transport_catalogue::render {
  namespace detail {
    // внутренняя кухня
  }
}

Почему detail?

  • скрывает вспомогательные типы
  • не засоряет публичный API
  • предотвращает конфликты имён

🔧 Ключевые компоненты рендера

SphereProjector

🧭 Проецирует lat/lngx/y в SVG

  • учитывает padding
  • масштабирует карту
  • предотвращает обрезание снизу

RouteDrawStyle

🎨 Стиль рисования маршрута

Позволяет:

  • переиспользовать код
  • легко менять толщину линий
  • управлять расстоянием между “туда / обратно”

DrawBusSegments

🛣 Общий движок рисования маршрутов

  • один код для:

    • карты маршрута
    • карты остановки
  • устраняет дублирование

  • корректно разводит двухсторонние маршруты


DrawStops

🚏 Остановки + подписи

  • обычный режим
  • выделение выбранной остановки
  • единый стиль

DrawHeader

📋 Шапка SVG

  • белая подложка
  • заголовок
  • легенда маршрутов
  • автоматически рассчитывает высоту

✨ Визуальные фишки

  • 🚌 автобус на линии
  • 👉 стрелка направления
  • 🚏 остановка
  • ⭐ выбранная остановка
  • цвета маршрутов
  • аккуратный развод линий

🧪 Почему архитектура корректная

✅ Нет глобальной логики ✅ Нет дублирования алгоритмов ✅ Чёткие зоны ответственности ✅ Готово к расширению (zoom, интерактивность) ✅ Читаемо для ревью


🏁 Итог

Проект демонстрирует:

  • аккуратную работу с namespace
  • разделение логики и визуализации
  • практическую геометрию
  • осмысленный рефакторинг
  • готовность к реальному использованию

🛠 Сборка и запуск

Проект поддерживает два режима работы:

  • 📄 Обычный (текстовый) — вывод статистики в stdout
  • 🎨 Интерактивный (SVG) — визуализация маршрутов и остановок

Режим выбирается на этапе компиляции.


📦 Сборка (обычный режим) -> ✨ chcp 65001 ✨

Без визуализации, только текстовые ответы на запросы

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 X
    • Stop X

🎨 Сборка (интерактивный SVG-режим) -> ✨ chcp 65001 ✨

Включает визуализацию маршрутов и остановок

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

🚌 Карта маршрута

  • линия маршрута
  • стрелки направления 👉
  • иконки автобусов 🚌
  • остановки 🚏
  • масштабирование по размеру SVG
  • заголовок с именем маршрута

🚏 Карта остановки

  • все маршруты через остановку (разные цвета)
  • аккуратный развод линий “туда / обратно”
  • выделение выбранной остановки ⭐
  • легенда маршрутов
  • динамическая шапка (не перекрывает карту)

🆕 Что нового (c Task 2)

✅ Обычный режим

  • добавлены stat-запросы:

    • Bus X
    • Stop X

✅ Интерактивный режим

  • выводится список маршрутов и остановок

  • можно выбирать SVG по номеру

  • поддерживается:

    • один маршрут
    • остановка со всеми маршрутами
  • улучшенная визуализация SVG


💡 Примечания

  • Режим выбирается на этапе компиляции, а не запуска

  • Код рендера (map_renderer) полностью изолирован и не влияет на текстовый режим

  • SVG можно:

    • открыть в браузере
    • вставить в HTML
    • сохранить как файл

🏁 Итог

Проект поддерживает:

  • 📄 текстовую обработку запросов
  • 🎨 визуализацию транспортной сети
  • 🧠 аккуратную архитектуру без дублирования
  • 🔧 два режима без изменения кода

About

C++17 transport catalogue with SVG route visualization, geographic projection, and interactive map rendering.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages