查询与 boost::geometry::index::rtree 的交集

Query for intersection with boost::geometry::index::rtree

我有 boost::geometry::index::rtree 轴对齐框在三个维度上的实例。我已经在 1.54 版本的 boost 中使用点交集。像魅力一样工作。好吧,我还想查询与线(射线,截面)的交点,boost 1.59 似乎支持它(错误,有一些小故障,但仍然令人印象深刻)。不幸的是,正如我所说,我使用的是 1.54 版。我现在没有机会改变它。所以问题是:如何在 boost 1.54 中扩展几何。所以它支持与 rtree 中的边界框相交的部分?我必须专注于哪些模板?还有什么我必须做的吗?想法? thb

如果将 bgi::intersects() 谓词传递到查询中,rtree 会在内部调用 bg::intersects(),后者会调用 bg::disjoint()。这些空间关系检查针对 QueryGeometry/Box 和 QueryGeometry/Indexable 进行了测试。例如。如果您要存储 Boxes,则 rtree 会在内部调用 bg::intersects(Box, QueryGeometry).

如果 QueryGeometry 类型适用于 Boost.Geometry 概念之一,例如段,但该功能根本没有在您使用的 Boost 版本中实现,您可以看到如何在最新版本的 Boost 中为概念组合实现算法。例如。 disjoint(Box, Segment) 在这里实现:https://github.com/boostorg/geometry/blob/master/include/boost/geometry/algorithms/detail/disjoint/segment_box.hpp。然后你可能会在 Boost 1.54 中找到相应的位置并将这段代码放在那里。尽管 AFAIR 目录和文件结构自 1.54 以来发生了变化。我想您也可以尝试将整个 1.59 Boost.Geometry 代码与 Boost 1.54 一起使用,但当然不能保证它会起作用。正如@sehe 在评论中指出的那样,1.59 中的 Box/Segment 组合在 disjoint/intersects 中存在错误。

如果 QueryGeometry 不是库支持的那种几何图形,这是 AFAIU 你的情况,例如Frustum、Cone、Plane、Ray 等。您可以简单地为 rtree 想要调用的类型组合重载 bg::intersects()bg::disjoint(),在本例中为您的 QueryGeometry 和 Box。有关更多信息,请参阅:Boost Geometry/Spatial Query Shapes