2015-11-13 141 views
1

我想通過在循環中添加boost::geometry::model::polygon來創建boost::geometry::model::multi_polygon。我已經瀏覽了boost的例子和文檔,但他們不清楚如何去做。這裏是我的代碼有Boost :: geometry如何將多邊形添加到multi_polygon中

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 
    } 
+2

爲什麼不自足的樣本......? – sehe

回答

2

多面觀的默認模式是只是一個多邊形的載體。

因此,您可以使用push_back,emplace_back,insert等。分配也可能是有趣的。你甚至可以使用transform(..,..,..,back_inserter(polygons))。要有創意:)

Live On Coliru

#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); 
    } 

}