Комментарии 4
Касаемо кода: какой-нибудь класс Point с переопределенными операциями сложения и хотя бы умножения на скаляр сделал бы ваш код на порядки более читаемым. Еще хорошо бы векторное/скалярные произведения переопределить, например через * и ^. y1 = seg1[1][1]
- вообще плохо. Все это вычисление пересечения отрезков становится буквально парой векторых/скалярных произведений. И количество параметров функций делится на 2 и имена будут более понятными.
his_tau
, shad_el
, iii
- вообще непоятные имена переменных. Я пока так и не разобрался, что там происходит.
А так, идея здравая - нанести все точки пересечения на отрезки, пометить их как вхождение внутрь или выход из другого многоугольника, потом выкинуть отрезки целиком внутри, и замкнуть все контура из оставшихся отрезков. Проблема с параллельными накладывающимеся отрезками и пересечениями по вершинам, но тут можно считать, что треугольник на epsilion больше, чем он есть на самом деле и так аккуратно рассмотреть несколько случаев.
Рассматривали ли вы использовать существующие библиотеки для решения задачи? Для C++ есть header-only библиотека Boost.Geometry где вышеупомянутая задача решается посредством функции union_.
https://www.boost.org/doc/libs/1_85_0/libs/geometry/doc/html/geometry/reference/algorithms/union_/union__3.html
Сами полигоны там описываются из колец: одно внешнее (внешний контур) и много внутренних (дырки). Каждое кольцо -- это std::vector из точек (есть встроенный класс, но можно и свой задать).
Здравствуйте,
Проблема объединения полигонов старая. И широко известная. Ровно как и обработка точек без потери точности, когда требуется узнать, лежит ли что-то "внутри" или "вне".
Вот приличная библиотека, занимающаяся проблемами подобного рода, которая является де-факто стандартом среди открытых библиотек:
https://doc.cgal.org/latest/Boolean_set_operations_2/group__boolean__intersection.html
Вот как она справляется с произвольной точностью:
https://www.cgal.org/exact.html
Используйте ее, она вам сэкономит кучу нервов и сил, пока вы сможете заниматься более сложной логикой или задачами, котоыре в ней не решены.
Заявка на участие в клубе создателей алгоритма объединения многоугольника и треугольника