2011-11-08 109 views
11

所以我想加入multi_polygon中所有相關的poligons。如何做這樣的事情?Boost :: Geometry:如何連接multi_polygon中的相交多邊形?

我們有我們要優化這樣的圖像(一個綠色multi_polygon的)(我們可以看到黃色的點劃線 - 這顯然是對multi_polygon的每個poligon不是一般multi_polygon進行簡化的結果):

enter image description here

這裏是編譯代碼產生這樣的形象:

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

至少需要升壓1.47.0和3個文件從boost/geometry/extensions/io/svg/

我所需要的很簡單:如何將相互關聯的poligons分組?在這種情況下,我們將得到我們的multy_poligon 2個poligons像這裏顯示 - 紅色和綠色:

enter image description here

更新:

所以我發現,使用環的透明片上dissolve這些信息並創建示例代碼創建:

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

它返回環的這樣的圖像:

enter image description here

如果我們可以使用溶解將它變成poligon,這將真正解決我的一些問題。但看起來像目前我們不能因爲這個編譯器錯誤問題描述here

+0

我想你可能會尋找連接提取算法:http://www.boost.org/doc/libs/1_47_0/libs/多邊形/ DOC/gtl_connectivity_extraction.htm –

回答

9

如何使用Qt。如果你使用QPolygonF,你可以調用unite,這正是你需要的。統一後,您可以提取點並將它們放回到您的增強容器中。

如果Qt是不是一種選擇,看看這裏提出http://www.wykobi.com

相關問題