boost :: geometry :: distance使用3D基元编译错误

问题描述 投票:1回答:1

我试图使用boost::geometry::index::nearest上的boost:: boost::geometry::index::rtree查询计算三维空间中另一个段的最近段,但是我得到以下编译错误:

错误C2664:'boost :: mpl :: assertion_failed':无法从'boost :: mpl :: fail ************转换参数1(__ cdecl boost :: geometry :: nyi :: not_implemented_error :: THIS_OPERATION_IS_NOT_OR_NOT_YET_IMPLEMENTED :: * ***********)(boost :: mpl :: assert _ :: types)'到'boost :: mpl :: assert :: type'

我设法将同样的问题缩小到只使用boost::geometry::distance函数:

typedef boost::geometry::model::point <float, 3, boost::geometry::cs::cartesian> point;
typedef boost::geometry::model::segment <point> segment;

point pa = point(x1, y1, z1);
point pc = point(x2, y2, z2);
point pb = point(x3, y3, z3);

float dist = boost::geometry::distance(segment(pa, pb), segment(pa, pc));

根据我正在使用的Boost版本(1.60)的文档,这应该得到支持,但是在使用两个维度时它可以正常工作。

http://www.boost.org/doc/libs/1_60_0/libs/geometry/doc/html/geometry/reference/algorithms/distance/distance_2.html#geometry.reference.algorithms.distance.distance_2.supported_geometries

我在文档中找不到任何关于如何扩展功能或者是否可能的功能。

c++ boost boost-geometry
1个回答
0
投票

在与Boost开发中的@awulkiew交换一些消息后,您可以在this ticket中看到当前的变通方法。

此时,N维段的一些内部函数没有实现:

是的,似乎N维段尚未实现不相交/相交。而distance()称这种算法。

作为一种解决方法,您可以在R树中存储段的边界框,然后使用迭代查询搜索最接近某个查询Box的Box,在每次迭代中使用您自己的实现检查段之间的实际距离,如果您的第k个找到,则停止segment比传入查询的边界框与当前迭代中找到的边界框之间的距离更近。所以基本上使用索引如何将它用于任何其他几何。

还有另一个涉及覆盖内部Boost功能的解决方法,但由于未来可能会发生变化,因此不鼓励这样做:

如果将来rtree内部发生变化(例如使用了不同的功能),我会劝阻你不要挂钩自己的功能。但是,如果你想尝试它,你可以重载bg::comparable_distance(segment, segment)bg::comparable_distance(segment, box),例如像那样:

namespace boost { namespace geometry {
    template <typename Box>
    float comparable_distance(segment const& s, Box const& b) { return 0; }
    float comparable_distance(segment const& s1, segment const& s2) { return 0; }
}}

Box将是R-tree内部用于表示节点的类型,因此bg :: model :: box <...>。

此外,目前还没有为此功能添加支持的ETA。

没有ETA,目前我们正在增加对2d地理CS的支持。

在我的例子中,解决方案是实现我自己的距离函数并使用类似于第一种解决方案中提出的算法。

© www.soinside.com 2019 - 2024. All rights reserved.