Mat*_*der 4 c++ boost boost-geometry
我想boost::geometry::model::multi_polygon通过boost::geometry::model::polygon在循环中添加s来创建一个。我已经查看了 boost 的示例和文档,但他们不清楚如何去做。这是我的代码
typedef boost::geometry::model::d2::point_xy<double> point_xy;
typedef boost::geometry::model::polygon<point_xy> polygon_type;
typedef boost::geometry::model::multi_polygon<polygon_type> multi_polygon_type;
// Calculate centroid
multi_polygon_type polygons;
Q_FOREACH( QGraphicsItem* graphicsItem, allItemsInScene )
{
// Make a polygon for each graphics item
polygon_type poly;
// Find bounding box surrounding item and create boost compatible points from it
QRectF boundingBox = graphicsItem->boundingRect();
std::vector< point_xy > pointList; // Store points in vector so we can assign them to a polygon
point_xy topLeft( boundingBox.topLeft().x(), boundingBox.topLeft().y() );
pointList.push_back( topLeft );
point_xy topRight( boundingBox.topRight().x(), boundingBox.topRight().y() );
pointList.push_back( topRight );
point_xy bottomRight( boundingBox.bottomRight().x(), boundingBox.bottomRight().y() );
pointList.push_back( bottomRight );
point_xy bottomLeft( boundingBox.bottomLeft().x(), boundingBox.bottomLeft().y() );
pointList.push_back( bottomLeft );
// assign points to polygon
boost::geometry::assign_points( poly, pointList );
// Add polygon to multi-polygon
boost::geometry::append( polygons, poly ); // DOESN'T WORK
}
Run Code Online (Sandbox Code Playgroud)
多多边形概念的默认模型只是一个多边形向量。
所以,你可以使用push_back,emplace_back,insert等分配也可能是有趣的。你甚至可以使用transform(..,..,..,back_inserter(polygons)). 要有创意:)
#include <boost/geometry.hpp>
#include <boost/geometry/geometries/multi_polygon.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
typedef boost::geometry::model::d2::point_xy<double> point_xy;
typedef boost::geometry::model::polygon<point_xy> polygon_type;
typedef boost::geometry::model::multi_polygon<polygon_type> multi_polygon_type;
struct QPoint {
double x() const { return 3; }
double y() const { return 4; }
};
struct QRectF {
QPoint bottomLeft() const { return { }; }
QPoint topLeft() const { return { }; }
QPoint topRight() const { return { }; }
QPoint bottomRight() const { return { }; }
};
struct QGraphicsItem {
QRectF boundingRect() const { return { }; };
};
int main() {
std::vector<QGraphicsItem*> allItemsInScene;
// Calculate centroid
multi_polygon_type polygons;
for(QGraphicsItem* graphicsItem : allItemsInScene)
{
// Make a polygon for each graphics item
polygon_type poly;
// Find bounding box surrounding item and create boost compatible points from it
QRectF boundingBox = graphicsItem->boundingRect();
std::vector< point_xy > pointList; // Store points in vector so we can assign them to a polygon
point_xy topLeft( boundingBox.topLeft().x(), boundingBox.topLeft().y() );
pointList.push_back( topLeft );
point_xy topRight( boundingBox.topRight().x(), boundingBox.topRight().y() );
pointList.push_back( topRight );
point_xy bottomRight( boundingBox.bottomRight().x(), boundingBox.bottomRight().y() );
pointList.push_back( bottomRight );
point_xy bottomLeft( boundingBox.bottomLeft().x(), boundingBox.bottomLeft().y() );
pointList.push_back( bottomLeft );
// assign points to polygon
boost::geometry::assign_points( poly, pointList );
// Add polygon to multi-polygon
polygons.push_back(poly);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1976 次 |
| 最近记录: |