【问题标题】:C++: Get list of simple polygons from polygon with holesC++:从带孔的多边形中获取简单多边形列表
【发布时间】:2017-05-12 15:48:56
【问题描述】:

我在 Boost::Polygon 上苦苦挣扎——显然它可以做任何事情,除了我想要的。我有一些边界描述了一组多边形及其孔(在二维空间中)。一般来说,我们甚至可以在一个洞中有一个洞(一个更大的多边形的洞中有一个较小的多边形),或者一个多边形中有很多洞。如果有必要,我可以检查哪个边界描述了一个洞,哪个描述了一个多边形。有时边界是分开的(并且不包含彼此),这意味着我们有很多多边形。我想要的是一种方法,它给了我一组简单的,不包含任何孔多边形,它们一起形成输入“孔”多边形。

【问题讨论】:

  • 不清楚你到底想要什么。如果您的多边形有孔,它们就不是简单的多边形。假设你有一个带洞的多边形▣,你想要什么样的输出?
  • 我想要的输出是得到两个多边形,它们一起形成一个带孔的输入多边形。
  • 哦,所以你想把输入的形状切割成简单的多边形。
  • 是的。对不起,如果我没有说清楚:)
  • this 不是您要找的东西吗?或者可以this

标签: c++ boost polygon boost-polygon


【解决方案1】:

这可以通过 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?
  • 我不确定 Boost Polygon 是否本机支持,但通过搜索“压裂”边缘并删除它们,自己实现这一点应该不会太难。
猜你喜欢
  • 2017-12-19
  • 2014-10-06
  • 2010-09-26
  • 2011-06-10
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多