Я борюсь с Boost :: Polygon — очевидно, он может делать все, кроме того, что я хочу. У меня есть несколько границ, описывающих множество полигонов и их дырок (в 2d пространстве). В общем, мы можем даже иметь отверстие в отверстии (меньший многоугольник в отверстии большего многоугольника) или много отверстий в одном многоугольнике. Если необходимо, я могу проверить, какая граница описывает отверстие, а какая описывает многоугольник. Иногда границы являются отдельными (и не содержат друг друга), что означает, что у нас много полигонов. То, что я хочу, — это метод, который дает мне набор простых, не содержащих многоугольников отверстий, которые вместе образуют входной многоугольник.
Это возможно с Boost Polygon. Тебе нужно polygon_set_data::get()
, что делает перелом отверстия для вас в случае, если вы преобразуете из концепции, поддерживающей многоугольник, отверстия в те, которые этого не делают. Увидеть: http://www.boost.org/doc/libs/1_65_0/libs/polygon/doc/gtl_polygon_set_concept.htm Больше подробностей.
Ниже приведен пример, где мы сначала представляем многоугольник с отверстием, а затем преобразуем его в простой многоугольник с одним кольцом:
#include <boost/polygon/polygon.hpp>
namespace bp = boost::polygon;
int main(void)
{
using SimplePolygon = bp::polygon_data<int>;
using ComplexPolygon = bp::polygon_with_holes_data<int>;
using Point = bp::point_data<int>;
using PolygonSet = bp::polygon_set_data<int>;
using SimplePolygons = std::vector<bp::polygon_data<int>>;
using namespace boost::polygon::operators;
std::vector<Point> points{{5, 0}, {10, 5}, {5, 10}, {0, 5}};
ComplexPolygon p;
bp::set_points(p, points.begin(), points.end());
{
std::vector<Point> innerPoints{{4, 4}, {6, 4}, {6, 6}, {4, 6}};
std::vector<SimplePolygon> inner(1, SimplePolygon{});
bp::set_points(inner.front(), innerPoints.begin(), innerPoints.end());
bp::set_holes(p, inner.begin(), inner.end());
}
PolygonSet complexPolygons;
complexPolygons += p;
SimplePolygons simplePolygons;
complexPolygons.get<SimplePolygons>(simplePolygons);
std::cout << "Fractured:\n";
for (const auto& polygon : simplePolygons)
{
for (const Point& p : polygon)
{
std::cout << '\t' << std::to_string(p.x()) << ", " << std::to_string(p.y())
<< '\n';
}
}
return 0;
}
Других решений пока нет …