2016-03-17 31 views
0

这是我的代码片。我正在尝试为顶点类对象创建一个rtree树RTreeVertexrtree是可索引断言

class Entity { 

public: 
    int num; 
public: 
    Entity(int nr): num(nr){ } 
    virtual ~Entity(){} 
    bool operator==(const Entity& b) 
    { 
    return num == b.num; 
    } 
}; 


class Vertex : public Entity { 

public : 
    struct Coord{ 
    double X, Y, Z; 
    }Pos; 

    Vertex(int num=0, double X=0., double Y=0., double Z=0.): Entity (num) 
    { 
    Pos.X = X; 
    Pos.Y = Y; 
    Pos.Z = Z; 
    } 
}; 

这里是我如何申报RTREE:

#include <boost/geometry/index/rtree.hpp> 
namespace bgi = boost::geometry::index; 
bgi::rtree< Vertex, bgi::linear<32> > RTreeVertex; 

,但我得到一个错误,指出VERTEC不是可转位。

还有一个一般问题:使用rtree存储与网格有关的数据是一个好主意吗?

回答

1

您必须使用增强几何注册您的点类。它为你的班级创造了许多特质。我测试了这个,它工作。

class Vertex : public Entity { 

    public : 
      double X, Y, Z; 

     Vertex(int num=0, double x=0., double y=0., double z=0.): Entity (num) 
     { 
      X = x; 
      Y = y; 
      Z = z; 
     } 
    }; 

BOOST_GEOMETRY_REGISTER_POINT_3D(Vertex, double, bg::cs::cartesian, X, X, X); 
#include <boost/geometry/index/rtree.hpp> 
namespace bgi = boost::geometry::index; 
bgi::rtree< Vertex, bgi::linear<32> > RTreeVertex; 

我不能让它在Pos :: X ...的结构中与X,Y,Z一起工作,可能有办法。您可以加入boost.org上的几何组。他们是几何专家。

附录: 我很好奇,所以我研究了REGISTER ..的工作原理。随着:

BOOST_GEOMETRY_REGISTER_POINT_3D(Vertex, double, bg::cs::cartesian, Pos.X, Pos.Y, Pos.Z); 

你可以使用你的结构为你的x,y,z。

和命名空间bg = boost :: geometry;

是名字空间我上面

+0

感谢用于您的答复,我有也从实体类派生的线,面类。我如何将它们注册到增强几何中? –

+0

请看:boost \ geometry \ geometries \ register所有注册类的宏都在那里,[geometry pdf](https://meetingcpp.com/tl_files/mcpp/slides/12/meetingcpp_boost_geometry_2012.pdf)如果你想推出自己的特质。 – lakeweb