【问题标题】:boost::geometry::distance compile errors with 3D primitivesboost::geometry::distance 使用 3D 基元编译错误
【发布时间】:2017-01-03 23:13:01
【问题描述】:

我正在尝试使用 boost:: boost::geometry::index::rtree 上的 boost::geometry::index::nearest 查询来计算 3 维空间中另一个段的最近段,但我收到以下编译错误:

错误 C2664:'boost::mpl::assertion_failed':无法转换参数 1 来自 'boost::mpl::failed ************(__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】:

    在与 Boost development 的 @awulkiew 交换了几条消息后,您可以在 this ticket 中看到当前的解决方法。

    目前还没有针对 N 维片段的一些内部函数的实现:

    是的,似乎还没有为 N 维段实现不相交/相交。而distance() 调用这个算法。

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

    还有另一种解决方法涉及覆盖内部 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 的支持。

    在我的情况下,解决方案是实现我自己的距离函数并使用第一个解决方法中提出的算法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多