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

7

我在使用Boost::Polygon时遇到了困难 - 显然它可以做任何事情,除了我想要的。我有一些边界,描述了一组多边形及其孔(在2d空间中)。通常,我们甚至可以在一个孔中拥有更小的多边形,或者在一个多边形中有许多孔。如果必要,我可以检查哪个边界描述了一个孔,哪个描述了一个多边形。有时边界是分离的(而不相互包含),这意味着我们有许多多边形。我想要的是一种方法,它可以给我一组简单的、不包含任何孔的多边形,这些多边形共同构成输入的“具有孔洞”的多边形。


1
不清楚你具体想要什么。如果你的多边形有洞,那它们就不是简单多边形了。比如说,如果你有一个带洞的多边形▣,你想要什么样的输出? - n. m.
我的期望输出是获得两个多边形,它们一起形成一个带洞的输入多边形。 - Ch3shire
这个链接是不是你要找的?(http://www.boost.org/doc/libs/1_57_0/libs/geometry/doc/html/geometry/reference/algorithms/difference.html)或者也许是这个链接?(http://www.boost.org/doc/libs/1_62_0/libs/polygon/doc/gtl_polygon_set_concept.htm) - Steeve
我尝试使用Boost::Polygon,但目前还没有成功。我将尝试使用这个“difference”方法,但尚未测试。 - Ch3shire
@Ch3shire 好的,请在找到解决方案后向我们更新。 - Steeve
显示剩余2条评论
1个回答

5
这可以通过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;
}

你知道如何反过来做吗?也就是从polygon_set转换为polygon_with_holes? - lakshayg
我不确定Boost Polygon是否原生支持此功能,但自己实现应该不难,只需搜索“断裂”边缘并将其删除即可。 - Ton van den Heuvel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接