在boost::geometry中初始化多边形

5

我刚开始接触泛几何库,这个库目前正在考虑加入boost库:

http://geometrylibrary.geodan.nl/

我有两个向量vector<int> Xb, Yb,我想从中创建一个多边形。我试图得到以下代码片段:

 polygon_2d P;

 vector<double>::const_iterator xi;
 vector<double>::const_iterator yi;

 for (xi=Xb.begin(), yi=Yb.begin(); xi!=Xb.end(); ++xi, ++yi)
  P.push_back (make<point_2d>(*xi, *yi));

以上代码无法工作,因为它抱怨 P 没有 push_back 成员函数。我该如何使用坐标为 vector<int> Xb,vector<int> Yb 的点来初始化多边形?


7
一个快速的提示:你提到的那个特定库存活下来的可能性是非常小的。今天你最好的选择是为通用多边形裁剪库编写一个轻量级的C++封装器,因为所有被提议的2D多边形操作都无法接近GPC所提供的性能。 - Matthieu N.
1
Dzhelil,幸运的是,区域算法很容易自己实现。http://alienryderflex.com/polygon_area/ - Stefan Monov
5
@Beh Tou Cheh - 供您和其他人参考,它已经幸存下来,并成为 Boost C++ 库的一部分。 - mloskot
@mloskot 期望使用哪个版本的Boost? - D R
1
现在它已经作为Boost.geometry被包含进来了。 - Ivan Xiao
显示剩余2条评论
3个回答

13
这里是关于你在Kirill回答下方评论中所问问题的扩展示例:多边形之间是否可能相交? 是的,Boost.Geometry(也称为GGL)支持多边形之间的相交。
#include <iostream>
#include <vector>
#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/cartesian2d.hpp>
#include <boost/geometry/geometries/adapted/c_array_cartesian.hpp>

using namespace boost::geometry;

int main(void)
{
    // Define a polygons and fill the outer rings.
    polygon_2d a;
    {
        const double c[][2] = {
            {160, 330}, {60, 260}, {20, 150}, {60, 40}, {190, 20}, {270, 130}, {260, 250}, {160, 330}
        };
        assign(a, c);
    }
    correct(a);
    std::cout << "A: " << dsv(a) << std::endl;

    polygon_2d b;
    {
        const double c[][3] = {
            {300, 330}, {190, 270}, {150, 170}, {150, 110}, {250, 30}, {380, 50}, {380, 250}, {300, 330}
        };
        assign(b, c);
    }
    correct(b);
    std::cout << "B: " << dsv(b) << std::endl;

    // Calculate interesection
    typedef std::vector<polygon_2d > polygon_list;
    polygon_list v;

    intersection_inserter<polygon_2d>(a, b, std::back_inserter(v));
    std::cout << "Intersection of polygons A and B" << std::endl;
    for (polygon_list::const_iterator it = v.begin(); it != v.end(); ++it)
    {
        std::cout << dsv(*it) << std::endl;
    }

    return 0;
}

这里是结果(为了更好的可见性,相交的多边形被向南移动):

alt text

我希望它能为你工作。


6
append(P, make<point_2d>(*xi, *yi));

谢谢,这解决了上面的问题。然而,现在我遇到了另一个问题。尝试将polygon_2d与另一个polygon_2d相交会返回错误。示例仅显示如何在box_2d和polygon_2d之间进行相交。多边形之间的相交是否可能? - D R

0

你也可以使用元组来初始化多边形

#include <boost/geometry/geometries/adapted/boost_tuple.hpp>

并且

boost::geometry::assign_points(
    polygon, boost::assign::tuple_list_of
        (300, 330) (190, 270) (150, 170) (150, 110) (250, 30) (380, 50)
        (380, 250) (300, 330)
);

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