Мне нужно работать с обобщенными полигонами, где ребра - это не только отрезки, но и отрезки окружности, и могут возникнуть отверстия. Поэтому я решил использовать
CGAL Булевы операции над множествами
с настройкой:
typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
typedef Kernel::Point_2 Point_2;
typedef Kernel::Circle_2 Circle_2;
typedef Kernel::Line_2 Line_2;
typedef CGAL::Gps_circle_segment_traits_2<Kernel> Traits_2;
typedef CGAL::General_polygon_set_2<Traits_2> Polygon_set_2;
typedef Traits_2::General_polygon_2 Polygon_2;
typedef Traits_2::General_polygon_with_holes_2 Polygon_with_holes_2;
typedef Traits_2::Curve_2 Curve_2;
typedef Traits_2::X_monotone_curve_2 X_monotone_curve_2;
typedef Traits_2::Point_2 Point_2t;
typedef Traits_2::CoordNT coordnt;
typedef CGAL::Arrangement_2<Traits_2> Arrangement_2;
typedef Arrangement_2::Face_handle Face_handle;
Мне нужно вычислить объединения большого числа полигонов (примерно до 200 000) и вычтите из таких союзов снова до 100 000-200 000 полигонов. Так что скорость - важная проблема. В приведенной выше настройке используется точное ядро, где числовой тип Point_2t имеет вид a0 + a1 sqrt (root), где a0, a1, root - рациональные числа. Чтобы ускорить процесс, я попытался скомпилировать все с помощью CGAL::Kernel<double>
, но это привело к ошибкам утверждения в коде CGAL.
Верно ли, что логические операции с полигонами делают точные ядро числового типа необходимо и не может работать с неточными CGAL::Kernel<double>
?
Если нет возможности для дальнейшего ускорения в этой библиотеке CGAL:
Есть ли еще (C ++) - библиотека для работы с обобщенными полигонами (имеющими также сегменты круга в качестве ребер) и вычисления логических операций над ними, что быстрее? (Например, потому что он использует только двойные значения в качестве значений координат точки?)