2013-10-13 71 views
1

我正在嘗試使用boost :: geometry多邊形類來計算交點及其區域。 我有我自己的3d piont類,我用它定義了一個多邊形。但是,當我嘗試使用area()或intersection()時,我收到許多編譯錯誤。編譯boost ::幾何多邊形

我知道我錯過了一些定義,或者一些額外的寄存器宏,但我不知道是哪一個。

我使用boost 1.54,VC++ 2010 express。

下面是一個不編譯的簡單程序。我如何編譯它?

#include <boost/geometry.hpp> 
#include <boost/geometry/geometry.hpp> 
#include <boost/geometry/geometries/polygon.hpp> 
#include <boost/geometry/geometries/register/point.hpp> 
#include <boost/geometry/geometries/register/ring.hpp> 

struct MyPoint 
{ 
    double x, y, z; 
}; 

typedef boost::geometry::model::polygon<MyPoint> Polygon; 

BOOST_GEOMETRY_REGISTER_POINT_3D(MyPoint, double, boost::geometry::cs::cartesian, x, y, z); 
BOOST_GEOMETRY_REGISTER_RING(Polygon::ring_type); 

inline void addPoint(Polygon& poly, double x, double y, double z) 
{ 
    MyPoint p; 
    p.x = x; p.y = y; p.z = z; 
    boost::geometry::append(poly, p); 
} 

int main() 
{ 
    Polygon poly1; 
    addPoint(poly1, 2, 0, 0); 
    addPoint(poly1, 2, 2, 0); 
    addPoint(poly1, 0, 2, 0); 
    addPoint(poly1, 0, 0, 0); 
    addPoint(poly1, 2, 0, 0); 

    Polygon poly2; 
    addPoint(poly2, 3, 0, 0); 
    addPoint(poly2, 3, 3, 0); 
    addPoint(poly2, 0, 3, 0); 
    addPoint(poly2, 0, 0, 0); 
    addPoint(poly2, 3, 0, 0); 

    Polygon intersectionPoly; 
    boost::geometry::intersection(poly1, poly2, intersectionPoly); 

    std::cout << "Intersection polygon area is " << boost::geometry::area(intersectionPoly) << '\n'; 
} 

編譯錯誤:

1>------ Build started: Project: TestPolygon, Configuration: Debug Win32 ------ 
1> main.cpp 
1>c:\dev\externals\boost_1_54_0\boost\range\iterator.hpp(63): error C2039: 'type' : is not a member of 'boost::mpl::eval_if_c<C,F1,F2>' 
1>   with 
1>   [ 
1>    C=false, 
1>    F1=boost::range_const_iterator<boost::geometry::model::polygon<MyPoint>>, 
1>    F2=boost::range_mutable_iterator<Polygon> 
1>   ] 
1>   c:\dev\externals\boost_1_54_0\boost\range\value_type.hpp(30) : see reference to class template instantiation 'boost::range_iterator<C>' being compiled 
1>   with 
1>   [ 
1>    C=Polygon 
1>   ] 
1>   c:\dev\externals\boost_1_54_0\boost\geometry\algorithms\intersection.hpp(97) : see reference to class template instantiation 'boost::range_value<T>' being compiled 
1>   with 
1>   [ 
1>    T=Polygon 
1>   ] 
1>   c:\dev\externals\boost_1_54_0\boost\geometry\algorithms\intersection.hpp(201) : see reference to function template instantiation 'bool boost::geometry::dispatch::intersection<Geometry1,Geometry2>::apply<GeometryOut,boost::geometry::strategy_intersection<Tag,Geometry1,Geometry2,IntersectionPoint>>(const Geometry1 &,const Geometry2 &,GeometryOut &,const Strategy &)' being compiled 
1>   with 
1>   [ 
1>    Geometry1=Polygon, 
1>    Geometry2=Polygon, 
1>    GeometryOut=Polygon, 
1>    Tag=boost::geometry::cartesian_tag, 
1>    IntersectionPoint=MyPoint, 
1>    Strategy=boost::geometry::strategy_intersection<boost::geometry::cartesian_tag,Polygon,Polygon,MyPoint> 
1>   ] 
1>   c:\test\main.cpp(45) : see reference to function template instantiation 'bool boost::geometry::intersection<Polygon,Polygon,Polygon>(const Geometry1 &,const Geometry2 &,GeometryOut &)' being compiled 
1>   with 
1>   [ 
1>    Geometry1=Polygon, 
1>    Geometry2=Polygon, 
1>    GeometryOut=Polygon 
1>   ] 
1>c:\dev\externals\boost_1_54_0\boost\range\value_type.hpp(30): error C3203: 'type' : unspecialized class template can't be used as a template argument for template parameter 'Iterator', expected a real type 
1>c:\dev\externals\boost_1_54_0\boost\range\value_type.hpp(30): error C2955: 'boost::type' : use of class template requires template argument list 
1>   c:\dev\externals\boost_1_54_0\boost\type.hpp(14) : see declaration of 'boost::type' 
1>c:\dev\externals\boost_1_54_0\boost\range\value_type.hpp(31): error C2955: 'boost::iterator_value' : use of class template requires template argument list 
1>   c:\dev\externals\boost_1_54_0\boost\iterator\iterator_traits.hpp(29) : see declaration of 'boost::iterator_value' 
1>d:\program files\microsoft visual studio 10.0\vc\include\iterator(21): error C2039: 'const_reference' : is not a member of 'boost::geometry::model::polygon<Point>' 
1>   with 
1>   [ 
1>    Point=MyPoint 
1>   ] 
1>   c:\dev\externals\boost_1_54_0\boost\geometry\algorithms\intersection.hpp(103) : see reference to class template instantiation 'std::back_insert_iterator<_Container>' being compiled 
1>   with 
1>   [ 
1>    _Container=Polygon 
1>   ] 
1>d:\program files\microsoft visual studio 10.0\vc\include\iterator(21): error C2146: syntax error : missing ';' before identifier 'const_reference' 
1>d:\program files\microsoft visual studio 10.0\vc\include\iterator(21): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>d:\program files\microsoft visual studio 10.0\vc\include\iterator(21): error C2602: 'std::back_insert_iterator<_Container>::const_reference' is not a member of a base class of 'std::back_insert_iterator<_Container>' 
1>   with 
1>   [ 
1>    _Container=Polygon 
1>   ] 
1>   d:\program files\microsoft visual studio 10.0\vc\include\iterator(21) : see declaration of 'std::back_insert_iterator<_Container>::const_reference' 
1>   with 
1>   [ 
1>    _Container=Polygon 
1>   ] 
1>d:\program files\microsoft visual studio 10.0\vc\include\iterator(21): error C2868: 'std::back_insert_iterator<_Container>::const_reference' : illegal syntax for using-declaration; expected qualified-name 
1>   with 
1>   [ 
1>    _Container=Polygon 
1>   ] 
1>d:\program files\microsoft visual studio 10.0\vc\include\iterator(22): error C2039: 'value_type' : is not a member of 'boost::geometry::model::polygon<Point>' 
1>   with 
1>   [ 
1>    Point=MyPoint 
1>   ] 
1>d:\program files\microsoft visual studio 10.0\vc\include\iterator(29): error C2182: '_Val' : illegal use of type 'void' 
1>d:\program files\microsoft visual studio 10.0\vc\include\iterator(35): error C2182: '_Val' : illegal use of type 'void' 
1>c:\dev\externals\boost_1_54_0\boost\geometry\algorithms\intersection.hpp(103): error C2064: term does not evaluate to a function taking 4 arguments 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

回答

3

有一些問題:

  • 的相交面產生一組多邊形(MultiPolygon概念),而不是一個單一的多邊形(這是爲什麼您收到關於缺失range_value<Polygon>特徵等的編譯錯誤)
  • area算法僅適用於二維座標系統。因此,它不會編譯爲assert_dimension<Ring, 2>()。我做

    struct MyPoint { double x, y/*, z*/; };  
    BOOST_GEOMETRY_REGISTER_POINT_2D(MyPoint, double, boost::geometry::cs::cartesian, x, y/*, z*/) 
    
  • 終於「固定」它,並沒有很好的形成的多邊形自己。您需要確保它們是指定的正確多邊形,或者使用correct算法來解決該問題。

這裏的一個固定/清洗樣品:Live on Coliru

#include <boost/geometry/geometry.hpp> 
#include <boost/geometry/geometries/register/point.hpp> 
#include <boost/geometry/geometries/register/ring.hpp> 

struct MyPoint 
{ 
    double x, y/*, z*/; 
}; 

BOOST_GEOMETRY_REGISTER_POINT_2D(MyPoint, double, boost::geometry::cs::cartesian, x, y/*, z*/) 

typedef boost::geometry::model::polygon<MyPoint> Polygon; 
BOOST_GEOMETRY_REGISTER_RING(Polygon::ring_type) 

int main() 
{ 
    using boost::geometry::append; 
    using boost::geometry::correct; 
    using boost::geometry::dsv; 

    Polygon poly1; 
    Polygon poly2; 

    append(poly1, MyPoint {2, 0}); 
    append(poly1, MyPoint {2, 2}); 
    append(poly1, MyPoint {0, 2}); 
    append(poly1, MyPoint {0, 0}); 
    append(poly1, MyPoint {2, 0}); 

    append(poly2, MyPoint {3, 0}); 
    append(poly2, MyPoint {3, 3}); 
    append(poly2, MyPoint {0, 3}); 
    append(poly2, MyPoint {0, 0}); 
    append(poly2, MyPoint {3, 0}); 

    correct(poly1); 
    correct(poly2); 

    std::vector<Polygon> polys; 
    if (boost::geometry::intersection(poly1, poly2, polys)) 
    { 
     for (Polygon const& inter : polys) 
      std::cout << "Intersection polygon area is " << boost::geometry::area(inter) << " with " << dsv(inter) << "\n"; 
    } 
} 

作爲獎勵,它打印的實際相交的多邊形:

Intersection polygon area is 4 with (((0, 0), (0, 2), (2, 2), (2, 0), (0, 0)))