首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >提升几何图形/空间查询形状

提升几何图形/空间查询形状
EN

Stack Overflow用户
提问于 2013-10-21 17:15:20
回答 3查看 2.6K关注 0票数 2

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

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

谢谢

EN

回答 3

Stack Overflow用户

发布于 2013-10-22 04:27:28

简而言之:它不受支持,因为目前在Boost.Geometry OOB中,金字塔和Frustum概念不可用/不受支持。

但是,从理论上讲,应该可以执行这样的查询。在查询期间,bgi::rtree调用在boost::geometry名称空间中定义的足够的布尔算法,例如,如果您调用

代码语言:javascript
运行
复制
rtree.query(bgi::intersects(my_geometry), out_it);

内部

代码语言:javascript
运行
复制
bg::intersects(xxx, my_geometry);

调用,其中xxx是节点的边界框或值的可索引(从用户传递到bgi::rtreeValueType中提取的几何图形,例如也是框或点)。因此,如果您实现了例如

代码语言:javascript
运行
复制
namespace boost { namespace geometry {

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

}}

从理论上讲,它应该是可行的。虽然没有测试过。

上图:

代码语言:javascript
运行
复制
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;

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

票数 3
EN

Stack Overflow用户

发布于 2014-04-01 14:57:40

我遇到了同样的问题,在与@Adam聊天后,他提出了以下解决方案,为我解决了这个问题(我在GCC上构建代码,上面的解决方案似乎只在Visual Studio上编译)。

代码语言:javascript
运行
复制
#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
EN

Stack Overflow用户

发布于 2014-11-05 05:02:14

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

代码语言:javascript
运行
复制
#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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19490435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档