Мне нужно вычислить полигон без подгонки (NFP) для двух полигонов, A и B, для целей вложения.NFP для A и B можно определить как NFP (A, B) = A (+) -B, где (+) - сумма Минковского.Я использую библиотеки C ++ и CGAL, которые предоставляют функции для вычисления сумм Минковского.Хорошо, после этого небольшого описания контекста, позвольте мне представить мою проблему.Есть несколько хорошо известных эталонных примеров нерегулярных двумерных задач, и я собираюсь использовать их в своих исследованиях.В экземпляре, называемом jakobs2, есть несколько пар многоугольников, которые точно совпадают, как показано на рисунке:
Точный регистр соответствия в экземпляре jakobs2
Я создал эти многоугольники в C ++ с этим кодом:
#include <CGAL/Exact_predicates_exact_constructions_kernel.h>
#include <CGAL/minkowski_sum_2.h>
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef CGAL::Point_2<Kernel> Point_2;
typedef CGAL::Polygon_2<Kernel, std::vector<Point_2>> Polygon_2;
typedef CGAL::Polygon_with_holes_2<Kernel, std::vector<Point_2>> Polygon_with_holes_2;
(...)
Polygon_2 *A = new Polygon_2();
A->push_back(Point_2(0, 0));
A->push_back(Point_2(10, 0));
A->push_back(Point_2(10, 10));
A->push_back(Point_2(8, 10));
A->push_back(Point_2(8, 2));
A->push_back(Point_2(2, 2));
A->push_back(Point_2(2, 10));
A->push_back(Point_2(0, 10));
Polygon_2 *B = new Polygon_2();
B->push_back(Point_2(0, 0));
B->push_back(Point_2(6, 0));
B->push_back(Point_2(6, 6));
B->push_back(Point_2(4, 6));
B->push_back(Point_2(4, 2));
B->push_back(Point_2(2, 2));
B->push_back(Point_2(2, 6));
B->push_back(Point_2(0, 6));
Polygon_2 *minus_B = new Polygon_2();
minus_B->push_back(Point_2(0, 0));
minus_B->push_back(Point_2(-6, 0));
minus_B->push_back(Point_2(-6, -6));
minus_B->push_back(Point_2(-4, -6));
minus_B->push_back(Point_2(-4, -2));
minus_B->push_back(Point_2(-2, -2));
minus_B->push_back(Point_2(-2, -6));
minus_B->push_back(Point_2(0, -6));
И, чтобы вычислить NFP (A, B), я использовал это:
Polygon_with_holes_2 nfp_A_B = CGAL::minkowski_sum_2(*A, *minus_B);
Переменная nfp_A_B, вычисленная minkowski_sum_2, была описана этими точками:
(4, 10), (2, 10), (-4, 10), (-6, 10), (-6, 4), (-6, -6), (-4, -6),
(-2, -6), (0, -6), (6, -6), (10, -6), (10, 0), (10, 10)
Эта последовательность точек образует квадрат.Сегмент линии от (2, -6) до (2, 2) должен быть включен в NFP (A, B), но это не так.Буду признателен за любую помощь в использовании CGAL :: minkowski_sum_2 для вычисления NFP с точным соответствием в этом случае или (лучше) в общем случае.