使用3D基元

时间:2017-01-03 23:13:02

标签: c++ boost boost-geometry

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

  

错误C2664:'boost :: mpl :: assertion_failed':无法转换参数   1来自'boost :: mpl ::失败************(__ cdecl   提高::几何::纽约摄影学院:: 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

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

1 个答案:

答案 0 :(得分:0)

在与Boost开发中的 @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树中内部用于表示节点的类型,因此bg :: model :: box&lt; ...&gt;。

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

  

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

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