/
Team8
/
kittycad
Обзор
Документация
Войти
/
Team8
/
kittycad
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/geometry/contours.cpp
77 строк
2 KB
levovix
fix: ortogonal snapping
19 ноя 2025, 15:56
19 ноя 2025, 15:56
055b9c7
Код
Авторство
О чём код?
#include "./contours.h" #include <curve.h> #include <cur_contour.h> SPtr<MbContour> constructContinuousContour(std::vector<SPtr<MbCurve>>& curves, bool allowUnclosed) { // todo: придумать более надёжный алгоритм constexpr double eps = 1e-2; if (curves.size() == 0) { return nullptr; } std::vector<SPtr<MbCurve>> sortedCurves; sortedCurves.push_back(curves.front()); curves.erase(curves.begin()); bool shouldEnd = false; while (!shouldEnd) { auto i = 0; shouldEnd = true; while (i < curves.size()) { auto& it = curves[i]; Point2 cp1, cp2; Point2 p1, p2; double cp1p = 0, cp2p = sortedCurves.back()->GetParamLength(); double p1p = 0, p2p = it->GetParamLength(); cp1 = sortedCurves.back()->PointOn(cp1p); cp2 = sortedCurves.back()->PointOn(cp2p); p1 = it->PointOn(p1p); p2 = it->PointOn(p2p); bool pop = false; if (p1.IsSame(cp2, eps)) { sortedCurves.push_back(it); pop = true; } else if (p2.IsSame(cp1, eps)) { sortedCurves.insert(sortedCurves.begin(), it); pop = true; } else if (p2.IsSame(cp2, eps)) { it->Inverse(); sortedCurves.push_back(it); pop = true; } else if (p1.IsSame(cp1, eps)) { it->Inverse(); sortedCurves.insert(sortedCurves.begin(), it); pop = true; } if (pop) { curves.erase(curves.begin() + i); shouldEnd = false; } else { ++i; } } } auto result = SPtr(new MbContour(sortedCurves, true)); if (allowUnclosed || result->IsClosed()) { return result; } else { return nullptr; } }