2013-10-21 55 views
2

我目前使用boost几何/空间索引库,以便在三维边界框上执行范围查询。例如,我能够获得所有边界框的列表,它们与查询边界框重叠。Boost几何/空间查询形状

该文档(http://www.boost.org/doc/libs/1_54_0_beta1/libs/geometry/doc/html/geometry/spatial_indexes/queries.html)显示 - 至少在2d中 - 可以使用多边形代替边界框作为查询对象。是否有可能在3D中使用更高级的查询形状?我正在考虑像定向包围盒,金字塔或相机锥体这样的对象。如果是这样的话:我该怎么做/我可以在哪里找到一个例子?

感谢

回答

3

简而言之:这不是因为支持现在Boost.Geometry OOB,金字塔和截锥体概念不可/支持。

但理论上应该可以执行这样的查询。在查询期间,bgi :: rtree调用在命名空间几何中定义的足够的布尔算法,例如,如果调用

rtree.query(bgi::intersects(my_geometry), out_it); 

内部

bg::intersects(xxx, my_geometry); 

被调用,其中xxx为节点的包围盒或价值的可转位(例如也有一个区域)。所以,如果你实现了

namespace boost { namespace geometry { 

template <typename Box> inline 
bool intersects(Box const& b, MyFrustum const& f) 
{ 
    // your implementation 
} 

}} 

理论上它应该工作。虽然没有测试过。

此外,如果你想开发人员直接联系你可能会考虑订阅Boost.Geometry邮件列表:http://lists.boost.org/mailman/listinfo.cgi/geometry

+0

谢谢您的提示。您发布的代码不会立即为我工作。不知道究竟是什么缺乏。看看intersects.hpp的源代码,我也觉得它应该......我会尽量让它工作 - 如果没有,我会直接向开发人员询问,正如你所建议的那样。 – Dtag

+0

我试过了,并且按照预期调用了这个函数。尽管我没有实现一个真实的工作示例。你能分享什么不起作用吗? –

+0

我为我的类型“cg :: Frustum”尝试了这个,并且只写了一个总是返回true的函数。我得到以下错误:/ usr/include/boost/geometry/core/point_type。hpp:45:5:错误:没有匹配函数调用'assertion_failed(mpl _ :: failed ************(boost :: geometry :: traits :: point_type :: NOT_IMPLEMENTED_FOR_THIS_POINT_TYPE :: ************)(mpl _ :: assert _ :: types ))' - 任何建议? –

2

我有同样的问题,并与@Adam聊天后,他提出了以下解决方案,它固定这个问题对我来说(我在GCC上构建我的代码,上面的解决方案似乎只在Visual Studio上编译)。

#include <boost/geometry.hpp> 

struct MyFrustum 
{ 
    MyFrustum(int d) : dummy(d) {} 
    int dummy; 
}; 

namespace boost { namespace geometry { 

// This will be called for Nodes and Values! 

template <typename Box> inline 
bool intersects(Box const& b, MyFrustum const& f) 
{ 
    std::cout << "checking the intersection with " << f.dummy << std::endl; 
    return true; 
} 

}} 

#include <boost/geometry/index/rtree.hpp> 

显然,这样编译器不会退回到它的默认实现(产生尚未实现的误差),其中东西定义的顺序是非常重要的。

希望能够帮助,再次感谢亚当!

1

这里的其他答案很好,但我仍然遇到了Xcode的麻烦,无论我包含/声明了什么东西。我将这个答案发布给那些无法在他们的环境中工作的人。 这里的其他解决方案在Visual Studio 2013中适用于我,但不适用于Xcode 5.1.1。该编译器似乎存在重载解决问题。解决方法是避免使用“Box”的模板类型,并直接使用所有具体类型,如下所示:

#include <boost/geometry.hpp> 

namespace bg = boost::geometry; 
using point3d = bg::model::point<float, 3, bg::cs::cartesian>; 
using box3d = bg::model::box<point3d>; 

namespace boost { namespace geometry { 

    template <> inline 
    bool intersects(box3d const& b, MyFrustum const& p) { 
     // your implementation 
     return true; 
    } 
}