C ++:从带孔的多边形中获取简单多边形的列表

时间:2016-12-28 11:06:08

标签: c++ boost polygon boost-polygon

我正在与Boost :: Polygon斗争 - 显然除了我想要的东西之外它可以做任何事情。我有几个边界描述多边形及其孔(在2d空间中)。一般来说,我们甚至可以在一个孔(较大的多边形的孔中较小的多边形)或一个多边形中的许多孔中有孔。如果有必要,我可以检查哪个边界描述了一个孔,哪个描述了一个多边形。有时边界是分开的(并且不相互包含),这意味着我们有许多多边形。我想要的是一种方法,它给了我一组简单的,不包含任何孔多边形,它们一起形成输入'多孔'多边形。

1 个答案:

答案 0 :(得分:3)

使用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;
}