如何将boost :: polygon中的polygon_set_data转换为polygon_data?

基列千

首先,我的意思是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个点的多边形。现在,我必须将结果多集转换为多边形类型,但是我没有找到一种方法。任何人都可以告诉我该怎么做?

看到

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

如果您知道是这种情况,我建议您只获取集合的第一个多边形(也许断言集合的大小为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() << "} ";
}

印刷相同

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将 Boost Polygon 划分为区域以在 C++ 中获得随机点?

将Polygon转换为边界框数组

将SF POLYGON转换为字符

如何将React多边形元素转换为google.maps.Polygon元素

Boost :: geometry如何将多边形添加到multi_polygon

如何将std :: array转换为boost :: asio :: buffer?

如何将Windows GUID转换为boost :: uuid?

将剪辑路径:polygon()转换为与Edge兼容的SVG

使用 geopandas 将数据框中的点行转换为 POLYGON

将POLYGON聚合为MULTIPOLYGON并保留data.frame

如何将指向 boost::multi_array 中元素的指针转换为其索引?

如何将齐次Fusion :: vector转换为(std / boost):: array

如何将boost :: spirit :: qi :: lexeme的属性转换为std :: string?

如何将`std :: chrono :: milliseconds`转换为`boost :: posix_time :: milliseconds`

如何将boost beast multi_buffer转换为字符串?

如何将 boost::string_view 转换为 std::string_view?

如何将Boost :: make_recursive_variant对象转换为字符串?

如何将单个对象转换为boost :: any_range?

如何从SVG读取Boost :: geometry :: model :: polygon

boost :: polygon_90_data无法处理面积值为0的多边形?

如何将查找表中的时变参数合并到boost :: odeint中,C ++

如何将Boost库(版本1.58)包括在Code :: Blocks中?

Boost Polygon的用途是什么?

如何将Set转换为Array?

如何将Á转换为A

如何将整个data.frame转换为数值

如何将嵌套列表转换为data.table?

如何将request.data转换为dict?

如何将 JSON 转换为 multipart/form-data