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

C++ 如何将boost::polygon中的多边形集合数据转换为多边形数据?,c++,boost,polygon,boost-polygon,C++,Boost,Polygon,Boost Polygon,首先,我指的是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::p

首先,我指的是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);
namespace gtl=boost::polygon;
使用名称空间boost::polygon::操作符;
typedef gtl::多边形_90_数据多边形;
typedef gtl::多边形特征::点类型点;
typedef gtl::多边形_90_集合_数据多边形;
点pts1[]=点(10000,20000),点(12000,20000),点(12000,14000),点(10000,14000)};
多边形poly1;
gtl::设定点(poly1、pts1、pts1+4);
点pts2[]={点(1150018000),点(1150025000),点(1400025000),点(1400018000)};
多边形多边形2;
gtl::设定点(poly2、pts2、pts2+4);
多起子多集;
分配(多边形集,多边形1+多边形2);

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

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

如果您知道是这样的话,我建议只获取集合的第一个多边形(可能断言集合的大小为1)

奖金 我可能更喜欢这样写:

#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() << "} ";
}
#包括
#包括
#包括
#包括
#包括
名称空间gtl=boost::polygon;
使用名称空间boost::polygon::操作符;
typedef gtl::多边形_90_数据多边形;
typedef gtl::多边形特征::点类型点;
typedef gtl::多边形_90_集合_数据多边形;
多边形生成多边形(std::初始化器列表初始化){
多边形p;
p、 set(init.begin(),init.end());
返回p;
}
模板
P get_联合体(P const&a、P const&b){
std::vector

v; 多发性(a+b)get(v); 断言(v.size()==1); 返回std::move(v.front()); } int main(){ 多边形u=得到u并集( 生成{u多边形({100,200},{120,200},{120,140},{100,140}), 使_多边形({115,180},{115,250},{140,250},{140,180}); 用于(自动和pt:u)


std::cout gtl::contains函数不能用polygon_set_数据和点调用,我必须使用polygon_数据和点,所以我必须将一个polygon_set_数据(2个polygon_数据的并集)转换为polygon_数据。哇。在一篇评论中,你基本上完全改变了这个问题。我保留了答案,因为我认为没有更直截了当的答案wad回答了基本目标,但可能其他人会知道(我会使用Boost Geometry完成此任务)
Union was: {140, 180} {120, 180} {120, 140} {100, 140} {100, 200} {115, 200} {115, 250} {140, 250} 
#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() << "} ";
}