我目前正在使用boost几何/空间索引库,以便在3d边界框上执行范围查询。例如,我能够获得与查询边界框重叠的所有边界框的列表。
文档(http://www.boost.org/doc/libs/1_54_0_beta1/libs/geometry/doc/html/geometry/spatial_indexes/queries.html)显示,至少在2d中,可以使用多边形代替边界框作为查询对象。是否可以在3d中使用更高级的查询形状?我正在考虑像定向边框,金字塔或相机截头体这样的对象。如果是这样的话:我怎么能这样做/我在哪里可以找到一个例子?
由于
答案 0 :(得分:3)
简而言之:它不受支持,因为目前在Boost.Geometry中,OOB,Pyramid和Frustum概念不可用/不受支持。
但是,理论上应该可以执行这样的查询。在查询期间,bgi::rtree
调用boost::geometry
命名空间中定义的足够的布尔算法,例如如果你打电话
rtree.query(bgi::intersects(my_geometry), out_it);
内部
bg::intersects(xxx, my_geometry);
调用,其中xxx
是节点的边界框或值的可索引(从用户传递到ValueType
的{{1}}中提取的几何图形,例如也可以是框或点)。所以,如果你实施了例如。
bgi::rtree
理论上它应该有用。虽然没有测试过。
以上:
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
答案 1 :(得分:2)
我遇到了同样的问题,在与@Adam聊天后,他提出了以下解决方案,为我解决了这个问题(我在GCC上构建代码,上面的解决方案似乎只在Visual Studio上编译)。 / p>
#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>
显然,定义事物的顺序很重要,因此编译器不会回退到其默认实现(这会产生尚未实现的错误)。
希望有所帮助,再次感谢Adam!
答案 2 :(得分:1)
这里的其他答案都很棒,但我在Xcode中仍然遇到麻烦,无论我包含/声明的内容是什么顺序。我将这个答案发布给那些无法在他们的环境中工作的人。 这里的其他解决方案在Visual Studio 2013中对我来说很好,但在Xcode 5.1.1中却没有。该编译器似乎存在重载解决问题。解决方案是避免使用模板类型&#34; Box&#34;并直接使用所有具体类型,如下所示:
#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;
}
}