C++ 使用boost生成一组矩形以在不规则多边形中形成网格

C++ 使用boost生成一组矩形以在不规则多边形中形成网格,c++,boost,geometry,boost-polygon,C++,Boost,Geometry,Boost Polygon,我需要创建一组预定大小的矩形,在不规则(可能不是凸的)多边形内部形成网格。(我意识到边缘上会有不适合矩形的部分。这些部分可以去掉。)所有东西都是二维的,我的点类型是双精度的。我正在处理UTM数据,所以我的多边形离原点很远。我必须用C++来工作。我有两个问题: 这可以用boost实现吗?我查看了Voronoi图表生成器,但在多边形内生成点的矩形晶格时遇到了问题 有没有其他更适合于在多边形内生成一组矩形的几何体库?我编写了自己的函数来实现这一点。它可能不漂亮,但它很管用。我首先确定了最高和最低的x和

我需要创建一组预定大小的矩形,在不规则(可能不是凸的)多边形内部形成网格。(我意识到边缘上会有不适合矩形的部分。这些部分可以去掉。)所有东西都是二维的,我的点类型是双精度的。我正在处理UTM数据,所以我的多边形离原点很远。我必须用C++来工作。我有两个问题:

这可以用boost实现吗?我查看了Voronoi图表生成器,但在多边形内生成点的矩形晶格时遇到了问题


有没有其他更适合于在多边形内生成一组矩形的几何体库?我编写了自己的函数来实现这一点。它可能不漂亮,但它很管用。我首先确定了最高和最低的x和y值。然后我将它们传递给这个函数,并根据常量值定义单元格的边界

using namespace std;

typedef boost::geometry::model::d2::point_xy<double> point_xy;
typedef boost::geometry::model::polygon<point_xy> polygon_type;

vector<polygon_type> createNScells(double nex, double ney, double swx, double swy) {
    vector<polygon_type> cells;

    double x1 = swx;
    double x2 = swx;

    point_xy first;
    point_xy second;
    point_xy third;
    point_xy fourth;

    while (x2 > nex) {//move x's
        x2 -= const1;
        double y1 = ney;
        double y2 = ney;
        while (y2 > swy) {//move y's
            y2 -= const2;
            //assign x's and y's to points
            first.x(x1);
            first.y(y1);
            second.x(x2);
            second.y(y2);
            third.x(x1);
            third.y(y2);
            fourth.x(x2);
            fourth.y(y1);
            polygon_type r;
            //assign points to polygon
            boost::geometry::append(r, first);
            boost::geometry::append(r, third);
            boost::geometry::append(r, second);
            boost::geometry::append(r, fourth);
            boost::geometry::append(r, first);
            cells.push_back(r);

            y1 = y2;
        }
        x1 = x2;
    }
    return cells;
}
使用名称空间std;
typedef boost::geometry::model::d2::point_xy point_xy;
typedef boost::geometry::model::polygon_type;
矢量创建单元(双nex、双ney、双swx、双swy){
载体细胞;
双x1=swx;
双x2=swx;
第一点;
第二点;
第三点;
第四点;
而(x2>nex){//move x's
x2-=常数1;
双y1=ney;
双y2=ney;
而(y2>swy){//move y's
y2-=常数2;
//为点指定x和y
第一.x(x1);
一是y(y1);
第二,x(x2);
第二,y(y2);
第三,x(x1);
第三,y(y2);
第四,x(x2);
第四,y(y1);
多边形_型r;
//为多边形指定点
boost::geometry::append(r,first);
boost::geometry::append(r,第三);
boost::geometry::append(r,秒);
boost::geometry::append(r,第四);
boost::geometry::append(r,first);
细胞。推回(r);
y1=y2;
}
x1=x2;
}
返回单元;
}
const1和const2定义单元格的大小。最后,我编写了一个函数来删除多边形边界以外的单元

for (int i = 0; i < cells.size(); ++i) {
    if (!boost::geometry::within(cells.at(i), polygons)) {
        swap(cells.at(i), cells.back());
        cells.pop_back();
    }
}
for(int i=0;i
这当然不是最简洁的解决方案,但我希望有办法提高代码的效率