如何将 boost::polygon 中的多边形集数据转换为多边形数据?

Posted

技术标签:

【中文标题】如何将 boost::polygon 中的多边形集数据转换为多边形数据?【英文标题】:How to convert a polygon_set_data in boost::polygon to polygon_data? 【发布时间】:2018-01-14 14:23:32 【问题描述】:

首先,我指的是 boost::polygon 库,而不是 boost::geometry 库。我的代码是:

namespace gtl = boost::polygon;
using namespace boost::polygon::operators;
typedef gtl::polygon_90_data<int> Polygon;
typedef gtl::polygon_traits<Polygon>::point_type Point;
typedef gtl::polygon_90_set_data<int> PolygonSet;
Point pts1[] =  Point(10000, 20000), Point(12000, 20000), Point(12000, 14000), Point(10000, 14000);
Polygon poly1;
gtl::set_points(poly1, pts1, pts1 + 4);

Point pts2[] =  Point(11500, 18000), Point(11500, 25000), Point(14000, 25000), Point(14000, 18000);
Polygon poly2;
gtl::set_points(poly2, pts2, pts2 + 4);

PolygonSet polyset;
assign(polyset, poly1 + poly2);

我想使用 poly1 和 poly2 的并集,它将是一个有 8 个点的多边形。现在我必须将结果 polyset 转换为 Polygon 类型,但我没有找到这样做的方法。谁能告诉我该怎么做?

【问题讨论】:

gtl::contains 函数不能用polygon_set_data 和point 调用,我必须使用polygon_data 和point,所以我必须将2 个polygon_data 联合的polygon_set_data 转换为polygon_data。 哇。在评论中,您基本上完全改变了问题。我保留了答案,因为我认为对于基本目标没有更直接的答案,但也许其他人会知道(我会使用 Boost Geometry 来完成这项任务) 【参考方案1】:

两个多边形的并集严格来说并不总是一个多边形(如果它们一开始是不相交的会怎样)。

如果您知道是这种情况,我建议您只获取集合的第一个多边形(也许断言集合的大小为 1)。

std::vector<Polygon> v;
polyset.get_polygons(v);
if (v.size() == 1) 
    std::cout << "Union was: ";
    Polygon p = std::move(v.front()); // attempt to prevent copying
    for (auto& pt : p)
        std::cout << "" << pt.x() << ", " << pt.y() << " ";
 else 
    std::cout << "Something not quite right here\n";

Live On Coliru打印

Union was: 140, 180 120, 180 120, 140 100, 140 100, 200 115, 200 115, 250 140, 250 

奖金

我可能会写得更像:

Live On Coliru

#include <boost/polygon/point_traits.hpp>
#include <boost/polygon/polygon.hpp>
#include <boost/polygon/polygon_set_data.hpp>
#include <boost/polygon/polygon_set_traits.hpp>
#include <boost/polygon/polygon_traits.hpp>

namespace gtl = boost::polygon;
using namespace boost::polygon::operators;

typedef gtl::polygon_90_data<int> Polygon;
typedef gtl::polygon_traits<Polygon>::point_type Point;
typedef gtl::polygon_90_set_data<int> PolygonSet;

Polygon make_polygon(std::initializer_list<Point> init) 
    Polygon p;
    p.set(init.begin(), init.end());
    return p;


template <typename P>
P get_union(P const& a, P const& b) 
    std::vector<P> v;
    PolygonSet(a+b).get(v);
    assert(v.size() == 1);
    return std::move(v.front());


int main() 
    Polygon u = get_union(
       make_polygon( 100, 200, 120, 200, 120, 140, 100, 140 ),
       make_polygon( 115, 180, 115, 250, 140, 250, 140, 180 ));

    for (auto& pt : u)
        std::cout << "" << pt.x() << ", " << pt.y() << " ";

打印一样

【讨论】:

以上是关于如何将 boost::polygon 中的多边形集数据转换为多边形数据?的主要内容,如果未能解决你的问题,请参考以下文章

boost::polygon 布尔减法导致额外的行

Boost Polygon:euclidean_distance 的问题

QGIS入门实战精品教程011:QGIS如何将点自动连成线线生成多边形?

初学计算几何——初识凸包

谁知道如何搜索平面点集的边界?

如何在 coco 数据集中定义内部多边形?