2011-11-08 16 views
11

Vì vậy, tôi muốn tham gia tất cả các poligon liên quan trong một đa_polygon. Làm thế nào để làm điều đó?Boost :: Geometry: cách tham gia các đa giác giao nhau trong multi_polygon?

Chúng tôi có hình ảnh như vậy (một multi_polygon xanh) mà chúng tôi muốn tối ưu hóa (chúng ta có thể thấy các đường doted vàng - kết quả của việc đơn giản hóa mà dường như đã được thực hiện trên mỗi Poligon của multi_polygon không phải trên multi_polygon nói chung):

enter image description here

và đây là mã biên dịch được để tạo ra hình ảnh ví dụ:

#include <iostream> 
#include <fstream> 
#include <boost/assign.hpp> 

#include <boost/algorithm/string.hpp> 
#include <boost/geometry/geometry.hpp> 
#include <boost/geometry/geometries/geometries.hpp> 
#include <boost/geometry/multi/geometries/multi_polygon.hpp> 

#include <boost/geometry/extensions/io/svg/svg_mapper.hpp> 

template <typename Geometry1, typename Geometry2> 
void create_svg(std::string const& filename, Geometry1 const& a, Geometry2 const& b) 
{ 
    typedef typename boost::geometry::point_type<Geometry1>::type point_type; 
    std::ofstream svg(filename.c_str()); 

    boost::geometry::svg_mapper<point_type> mapper(svg, 400, 400); 
    mapper.add(a); 
    mapper.add(b); 

    mapper.map(a, "fill-opacity:0.5;fill:rgb(153,204,0);stroke:rgb(153,204,0);stroke-width:2"); 
    mapper.map(b, "opacity:0.8;fill:none;stroke:rgb(255,128,0);stroke-width:4;stroke-dasharray:1,7;stroke-linecap:round"); 
} 


boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > make_point(int x, int y) 
{ 
    boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > return_item; 
    boost::geometry::model::d2::point_xy<double> p1(x, y); 
    boost::geometry::model::d2::point_xy<double> p2(x-1, y); 
    boost::geometry::model::d2::point_xy<double> p3(x-1, y-1); 
    boost::geometry::model::d2::point_xy<double> p4(x, y-1); 

    boost::geometry::append( return_item, p1); 
    boost::geometry::append( return_item, p2); 
    boost::geometry::append( return_item, p3); 
    boost::geometry::append( return_item, p4); 

    return return_item; 

} 

int main() 
{ 
    // create a container for joined points structure 
    boost::geometry::model::multi_polygon< boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > > output, simpl; 

    // join points one by one (because one day we would have many=)) 
    output.push_back(make_point(1,1)); 
    boost::geometry::correct(output); 

    output.push_back(make_point(2,1)); 
    boost::geometry::correct(output); 

    output.push_back(make_point(3,1)); 
    boost::geometry::correct(output); 

    output.push_back(make_point(4,1)); 
    boost::geometry::correct(output); 

    output.push_back(make_point(5,1)); 
    boost::geometry::correct(output); 

    output.push_back(make_point(2,2)); 
    boost::geometry::correct(output); 

    output.push_back(make_point(3,2)); 
    boost::geometry::correct(output); 

    output.push_back(make_point(5,2)); 
    boost::geometry::correct(output); 

    output.push_back(make_point(5,5)); 
    boost::geometry::correct(output); 


    // simplify joined structure 
    boost::geometry::simplify(output, simpl, 0.5); 

    // create an svg image 
    create_svg("make_envelope.svg", output, simpl); 
} 

đòi hỏi ít nhất tăng 1.47.0 và 3 tập tin từ boost/geometry/extensions/io/svg/

những gì tôi cần là đơn giản: làm thế nào để nhóm các poligon liên quan? Trong trường hợp này chúng ta sẽ nhận được 2 poligons trong multy_poligon của chúng tôi như đưa ra ở đây - đỏ và xanh lá cây:

enter image description here

Cập nhật:

Vì vậy, tôi tìm thấy thông tin này trên dissolve và tạo mã mẫu sử dụng chiếc nhẫn cho Cels tạo:

#include <iostream> 
#include <fstream> 
#include <boost/assign.hpp> 

//Boost 
#include <boost/algorithm/string.hpp> 
#include <boost/geometry/geometry.hpp> 
#include <boost/geometry/geometries/geometries.hpp> 
#include <boost/geometry/multi/geometries/multi_polygon.hpp> 
#include <boost/geometry/geometries/adapted/boost_tuple.hpp> 

BOOST_GEOMETRY_REGISTER_BOOST_TUPLE_CS(cs::cartesian) 

#include <boost/foreach.hpp> 

//Boost Geometry extensions (from trunk) 
#include <boost/geometry/extensions/io/svg/svg_mapper.hpp> 

template <typename Geometry1, typename Geometry2> 
void create_svg(std::string const& filename, Geometry1 const& a, Geometry2 const& b) 
{ 
    typedef typename boost::geometry::point_type<Geometry1>::type point_type; 
    std::ofstream svg(filename.c_str()); 

    boost::geometry::svg_mapper<point_type> mapper(svg, 400, 400); 
    mapper.add(a); 
    mapper.add(b); 

    mapper.map(a, "fill-rule:nonzero;fill-opacity:0.5;fill:rgb(153,204,0);stroke:rgb(153,204,0);stroke-width:2;"); 
    mapper.map(b, "opacity:0.8;fill:none;stroke:rgb(255,128,0);stroke-width:4;stroke-dasharray:1,7;stroke-linecap:round"); 
} 

void make_point(int x, int y, boost::geometry::model::ring<boost::geometry::model::d2::point_xy<double> > & ring) 
{ 
    using namespace boost::assign; 

    ring += 
     boost::geometry::model::d2::point_xy<double>(x-1, y-1), 
     boost::geometry::model::d2::point_xy<double>(x, y-1), 
     boost::geometry::model::d2::point_xy<double>(x, y), 
     boost::geometry::model::d2::point_xy<double>(x-1, y), 
     boost::geometry::model::d2::point_xy<double>(x-1, y-1); 

} 

int main() 
{ 
    using namespace boost::assign; 
    boost::geometry::model::ring<boost::geometry::model::d2::point_xy<double> > ring0, ring1,ring; 

    boost::geometry::model::multi_polygon< boost::geometry::model::polygon<boost::geometry::model::d2::point_xy<double> > > outputw; 

    make_point(1, 1, ring) ; 
    make_point(2, 1, ring) ; 
    make_point(3, 1, ring) ; 
    make_point(4, 1, ring) ; 
    make_point(5, 1, ring) ; 
    make_point(2, 2, ring) ; 
    make_point(3, 2, ring) ; 
    make_point(5, 2, ring) ; 

    boost::geometry::model::ring<boost::geometry::model::d2::point_xy<double> > output; 
    boost::geometry::simplify(ring, output, 1); 

    // create an svg image 
    create_svg("make_envelope.svg", ring, output); 
} 

Nó trả về hình ảnh như vậy vòng:

enter image description here

Nếu chúng ta có thể sử dụng hòa tan để biến nó thành poligon mà thực sự sẽ giải quyết được một số vấn đề của tôi. Nhưng có vẻ như hiện tại chúng tôi không thể do vấn đề lỗi trình biên dịch này được mô tả here

+0

Tôi nghĩ rằng bạn có thể tìm kiếm kết nối Extraction: http://www.boost.org/doc/libs/1_47_0/libs/ đa giác/doc/gtl_connectivity_extraction.htm –

Trả lời

9

Điều gì về việc sử dụng Qt. Nếu bạn sử dụng một QPolygonF bạn có thể gọi unite mà không chính xác những gì bạn cần. Sau khi unison bạn có thể trích xuất các điểm và đưa chúng trở lại vào container tăng cường của bạn.

Nếu qt không phải là một lựa chọn hãy nhìn vào các thuật toán đề xuất ở đây http://www.wykobi.com

Các vấn đề liên quan