Skip to content

πŸ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° гСомСтричСских ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² Π½Π° C++23. Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ (выпуклая ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°, триангуляция Π”Π΅Π»ΠΎΠ½Π΅) ΠΈ поиск пСрСсСчСний с использованиСм std::variant, ranges ΠΈ словарных Ρ‚ΠΈΠΏΠΎΠ²

License

Notifications You must be signed in to change notification settings

nmaks2012/GeometryApp

Repository files navigation

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° гСомСтричСских ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² Π½Π° C++23

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с гСомСтричСскими ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Π°ΠΌΠΈ. ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½ с Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ соврСмСнных возмоТностСй C++, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ словарныС Ρ‚ΠΈΠΏΡ‹, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ ΠΈ Π½ΠΎΠ²Ρ‹Π΅ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ особСнности

ГСомСтричСскиС ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²Ρ‹

  • Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π°Π±ΠΎΡ€ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… Ρ„ΠΈΠ³ΡƒΡ€: Point2D, Line, Triangle, Rectangle, RegularPolygon, Polygon, Circle.
  • Для ΠΏΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„ΠΈΠ³ΡƒΡ€Π°ΠΌΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ std::variant, Ρ‡Ρ‚ΠΎ позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Ρ… расходов Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ обСспСчиваСт Ρ‚ΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ.

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹

  • Выпуклая ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°: Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ ГрэхСма для нахоТдСния минимальной Π²Ρ‹ΠΏΡƒΠΊΠ»ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ для Π½Π°Π±ΠΎΡ€Π° Ρ‚ΠΎΡ‡Π΅ΠΊ (O(N * log(N))).
  • Вриангуляция Π”Π΅Π»ΠΎΠ½Π΅: Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ Боуэра-Ватсона для разбиСния Π½Π°Π±ΠΎΡ€Π° Ρ‚ΠΎΡ‡Π΅ΠΊ Π½Π° Ρ‚Ρ€Π΅ΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠΈ, ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‰ΠΈΠ΅ ΡƒΡΠ»ΠΎΠ²ΠΈΡŽ Π”Π΅Π»ΠΎΠ½Π΅.
  • Поиск пСрСсСчСний: Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π΄Π²ΠΎΠΉΠ½ΠΎΠΉ диспСтчСризации (std::visit) Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ поиск Ρ‚ΠΎΡ‡Π½Ρ‹Ρ… пСрСсСчСний для ΠΏΠ°Ρ€ Ρ„ΠΈΠ³ΡƒΡ€: Line-Line, Line-Circle, Circle-Circle.
  • Поиск ΠΊΠΎΠ»Π»ΠΈΠ·ΠΈΠΉ: Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ быстрый поиск Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… столкновСний ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Bounding Box (AABB).
  • Анализ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²: Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для вычислСния расстояний (ΠΎΡ‚ Ρ‚ΠΎΡ‡ΠΊΠΈ Π΄ΠΎ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„ΠΈΠ³ΡƒΡ€Π°ΠΌΠΈ) ΠΈ Π°Π½Π°Π»ΠΈΠ·Π° свойств (поиск самой высокой Ρ„ΠΈΠ³ΡƒΡ€Ρ‹).

ИспользованиС соврСмСнного C++

  • C++23: ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ возмоТности послСднСго стандарта.
  • Ranges: Для Π»Π°ΠΊΠΎΠ½ΠΈΡ‡Π½ΠΎΠΉ ΠΈ эффСктивной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с коллСкциями ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‚ΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ².
  • Π‘Π»ΠΎΠ²Π°Ρ€Π½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹: Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ std::optional ΠΈ std::expected для бСзопасной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ.
  • Атрибуты ΠΈ спСцификаторы: ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹ классов снабТСны Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌΠΈ [[nodiscard]] ΠΈ спСцификаторами noexcept для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ бСзопасности ΠΈ ясности ΠΊΠΎΠ΄Π°.
  • Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ std::formatter для std::vector<geometry::Point2D> с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… спСцификаторов ({} ΠΈ {:new_line}).

ВСхнологичСский стСк

  • Π―Π·Ρ‹ΠΊ: C++23
  • БистСма сборки: CMake
  • ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€Ρ‹ зависимостСй: Conan, CPM.cmake
  • ВСстированиС: GoogleTest
  • Визуализация: matplotplusplus
  • Π‘Ρ€Π΅Π΄Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ: VS Code Dev Docker container

Π‘Π±ΠΎΡ€ΠΊΠ° ΠΈ запуск

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ настроСнноС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π² Docker ΠΈ стандартныС инструмСнты для упрощСния процСсса Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π‘Π±ΠΎΡ€ΠΊΠ° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

НаТмитС F5 Π² VS Code. Π­Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° автоматичСски Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги:

  • Боздаст Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ build.
  • Π’Ρ‹Π·ΠΎΠ²Π΅Ρ‚ conan для установки зависимостСй.
  • Запустит cmake для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΈ сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.
  • Запустит ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅ lldb.

Запуск прилоТСния

cd build
./GeometryApp

Команда для запуска тСстов

cd build
ctest

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ для запуска ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°

Π’ Visual Studio Code настройки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² для запуска ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° находятся Π² .vscode/launch.json Ρ„Π°ΠΉΠ»Π΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² этом Ρ„Π°ΠΉΠ»Π΅ ΡƒΠΆΠ΅ Π΅ΡΡ‚ΡŒ ΠΎΠ΄Π½Π° конфигурация Launch GeometryApp для запуска прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ вычисляСт ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΡƒΡŽ сумму Ρ„Π°ΠΉΠ»Π°, Ρ‚ΠΎ для запуска ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° достаточно Π½Π°ΠΆΠ°Ρ‚ΡŒ F5 ΠΈΠ»ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΠΊΠ½ΠΎ Run and Debug ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠ΅ΠΉ клавиш Ctrl+Shift+D.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ использования

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½Π° с matplotplusplus для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ гСомСтричСских ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ². matplotplusplus ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ gnuplot Π² качСствС бэкСнда.

ΠŸΠ΅Ρ€Π΅ΡΠ΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΠΈΠ³ΡƒΡ€ (Shape Intersections)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ построСния Π½Π°Π±ΠΎΡ€Π° случайных Ρ„ΠΈΠ³ΡƒΡ€.

Выпуклая ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° (Convex Hull)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ нахоТдСния Π²Ρ‹ΠΏΡƒΠΊΠ»ΠΎΠΉ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ для Π½Π°Π±ΠΎΡ€Π° случайных Ρ‚ΠΎΡ‡Π΅ΠΊ.

Вриангуляция Π”Π΅Π»ΠΎΠ½Π΅ (Delaunay Triangulation)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ построСния триангуляции Π”Π΅Π»ΠΎΠ½Π΅.

Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ

  • АвтодополнСниС Ctrl + Space. Для настройки автодополнСния Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ F1 ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ clangd: Download language server. VS Code сам ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΡΡ‰ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ clangd (Π²ΡΠΏΠ»Ρ‹Π²Π°ΡˆΠΊΠ° Π² ΠΏΡ€Π°Π²ΠΎΠΌ Π½ΠΈΠΆΠ½Π΅ΠΌ ΡƒΠ³Π»Ρƒ). ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ установки потрСбуСтся ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΎΠΊΠ½ΠΎ (ΠΊΠ½ΠΎΠΏΠΊΠ° пСрСзапуска Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊΠΆΠ΅ справа снизу ΠΈΠ»ΠΈ Π½Π°ΠΆΠ°Ρ‚ΡŒ F1 ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Developer: Reload Window)

Если всё сдСлано ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ - послС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΉ сборки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π²Ρ‹ смоТСтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

About

πŸ“ Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° гСомСтричСских ΠΏΡ€ΠΈΠΌΠΈΡ‚ΠΈΠ²ΠΎΠ² Π½Π° C++23. Π Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ (выпуклая ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°, триангуляция Π”Π΅Π»ΠΎΠ½Π΅) ΠΈ поиск пСрСсСчСний с использованиСм std::variant, ranges ΠΈ словарных Ρ‚ΠΈΠΏΠΎΠ²

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages