C++:从带孔的多边形中获取简单多边形的列表
C++: Get list of simple polygons from polygon with holes
我正在努力 Boost::Polygon - 显然它可以做任何事情,除了我想要的事情。我有一些边界描述了一组多边形及其孔(在 2d space 中)。一般来说,我们甚至可以在一个洞中有一个洞(较小的多边形在一个较大的多边形的洞中),或者一个多边形中有多个洞。如果有必要,我可以检查哪个边界描述了一个洞,哪个边界描述了一个多边形。有时边界是分开的(并且不包含彼此),这意味着我们有很多多边形。我想要的是一种方法,它给我一组简单的、不包含任何孔的多边形,它们一起形成输入 'holey' 多边形。
这可以通过 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;
}
我正在努力 Boost::Polygon - 显然它可以做任何事情,除了我想要的事情。我有一些边界描述了一组多边形及其孔(在 2d space 中)。一般来说,我们甚至可以在一个洞中有一个洞(较小的多边形在一个较大的多边形的洞中),或者一个多边形中有多个洞。如果有必要,我可以检查哪个边界描述了一个洞,哪个边界描述了一个多边形。有时边界是分开的(并且不包含彼此),这意味着我们有很多多边形。我想要的是一种方法,它给我一组简单的、不包含任何孔的多边形,它们一起形成输入 'holey' 多边形。
这可以通过 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;
}