Boost 增强几何体:模板化增强几何体寄存器盒2D值

Boost 增强几何体:模板化增强几何体寄存器盒2D值,boost,boost-geometry,Boost,Boost Geometry,我想在Boost Geometry包中使用R-tree来构建空间索引。我想使用我自己的Box(CRectangle)数据结构,因为我正在使用第三方库进行多边形操作 首先,我遵循本教程注册自定义点/框类型 我得到了以下(简化的)代码,它工作正常。我得到的正确面积是4 #include <iostream> #include <boost/geometry.hpp> #include <boost/geometry/index/rtree.hpp> #includ

我想在Boost Geometry包中使用R-tree来构建空间索引。我想使用我自己的Box(CRectangle)数据结构,因为我正在使用第三方库进行多边形操作

首先,我遵循本教程注册自定义点/框类型

我得到了以下(简化的)代码,它工作正常。我得到的正确面积是4

#include <iostream>
#include <boost/geometry.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <boost/geometry/geometries/register/point.hpp>
#include <boost/geometry/geometries/register/box.hpp>

namespace bg  = boost::geometry;
namespace bgi = boost::geometry::index;

struct dummy_pt
{
    int x,y;
};

class CRectangle
{
 private:
   int xmin, xmax, ymin, ymax;

 public:
   // implementation not shown.
   int xmin();
   int ymin();
   int xmax();
   int ymax();
}

BOOST_GEOMETRY_REGISTER_POINT_2D(dummy_pt, int, bg::cs::cartesian, x, y)
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRectangle, dummy_pt, xmin(), ymin(), xmax(), ymax())

int main(int argc, char** argv)
{
    CRectangle x = bg::make<CRectangle>(0,0,2,2);
    std::cout << "Area: " << bg::area(x) << std::endl;
    return 0;
}
#包括
#包括
#包括
#包括
#包括
名称空间bg=boost::geometry;
名称空间bgi=boost::geometry::index;
结构虚拟单元
{
int x,y;
};
类交叉角
{
私人:
int xmin,xmax,ymin,ymax;
公众:
//未显示实现。
int-xmin();
int-ymin();
int-xmax();
int-ymax();
}
升压几何寄存器点2D(虚拟点,整数,背景::cs::笛卡尔坐标,x,y)
BOOST_几何体_寄存器_盒_2D_4值(CRectangle、dummy_pt、xmin()、ymin()、xmax()、ymax())
int main(int argc,字符**argv)
{
CRectangle x=bg::make(0,0,2,2);

std::cout我应该做更多的调查。以下代码片段有效!我刚刚注册了两种可能性:

BOOST_GEOMETRY_REGISTER_POINT_2D(dummy_pt, int, bg::cs::cartesian, x, y)
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRectangle<int>, dummy_pt, xmin(), ymin(), xmax(), ymax())
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRectangle<double>, dummy_pt, xmin(), ymin(), xmax(), ymax())

int main(int argc, char** argv)
{
    CRectangle<int> x = bg::make<CRectangle<int>> (0,0,2,2);
    CRectangle<double> y = bg::make<CRectangle<double>> (0,0,3,3);
    std::cout << "Area: " << bg::area(x) << std::endl;
    std::cout << "Area: " << bg::area(y) << std::endl;
    return 0;
}
BOOST\u GEOMETRY\u REGISTER\u POINT\u 2D(伪点,int,bg::cs::笛卡尔坐标,x,y)
BOOST_几何体_寄存器_盒_2D_4值(CRectangle、dummy_pt、xmin()、ymin()、xmax()、ymax())
BOOST_几何体_寄存器_盒_2D_4值(CRectangle、dummy_pt、xmin()、ymin()、xmax()、ymax())
int main(int argc,字符**argv)
{
CRectangle x=bg::make(0,0,2,2);
CRectangle y=bg::make(0,0,3,3);

std::不能只展开宏。它将定义一个(小的)一组特征。使用部分模板专门化来定义它们。完成了。谢谢,但我不太擅长模板编程。你能提供一个小例子让它更清楚吗?对不起。在这种情况下,你的工作似乎很好。你为什么要我做你不想做的事情?你可以用具体的方法来做到这一点如果你被卡住了。
CRectangle<int> or CRectangle<double>
BOOST_GEOMETRY_REGISTER_POINT_2D(dummy_pt, int, bg::cs::cartesian, x, y)
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRectangle<int>, dummy_pt, xmin(), ymin(), xmax(), ymax())
BOOST_GEOMETRY_REGISTER_BOX_2D_4VALUES(CRectangle<double>, dummy_pt, xmin(), ymin(), xmax(), ymax())

int main(int argc, char** argv)
{
    CRectangle<int> x = bg::make<CRectangle<int>> (0,0,2,2);
    CRectangle<double> y = bg::make<CRectangle<double>> (0,0,3,3);
    std::cout << "Area: " << bg::area(x) << std::endl;
    std::cout << "Area: " << bg::area(y) << std::endl;
    return 0;
}