最近的飞机到一个点

时间:2015-05-06 23:19:21

标签: image-processing 3d plane

我正在使用一组平面和一组​​3D点。

我想找到与我集合中每个点最近的平面。

现在我计算我的平面集中每个平面的一个点的偏差并决定一个是最接近的平面,然后我对我的点集中的每个点重复相同的过程。这很好,但计算成本取决于我拥有的平面数量,所以如果我添加更多的平面(通常我使用超过500个平面),处理时间会增加很多。

有没有更有效的方法来知道距离点最近的平面而无需计算到每个平面的距离?

我正在使用C ++和VTK库实现这一点

使用来自3D跟踪器的信息预先计算平面,并且点由用户定义。

这段代码计算点坐标(体素)并调用DistanceToPlane来计算从体素到所有平面的距离。运行此命令后,vnl_vector距离应该与指向云中每个点的距离最近。

fb://post/{postid}

DistanceToPlane()函数计算从一个点到一个平面的距离,此函数称为每个点的N次(N =平面数)。此函数在VTK库中实现。

由于

1 个答案:

答案 0 :(得分:0)

更新更新了算法,使其可用于任意平面

我也在寻找完全相同的问题的解决方案。

该解决方案需要有限的搜索空间(最小/最大x / y / z)。这是一种3D空间分区数据结构,您可以更轻松地查询最近的平面。

预先计算分区数据:

  1. 将搜索空间划分为X/Y/Z buckets(合理选择大小,例如给定维度的1/20,这将为您提供8000个存储桶)。
  2. 现在,我们为每个bucket分配候选项planes,以测量该点是否在bucket内。

    1. 首先将与planes相交的所有bucket指定为候选对象。
    2. 现在,对于每个不与plane相交的bucket,计算bucket角的投影(8个投影)
    3. 现在,对于每个这样的plane,检查 all 投影和plane之间是否还有 other bucket(例如plane other plane完全覆盖
    4. 现在,将所有未被覆盖的平面添加到bucket个候选对象中。

现在查询部分。给定point

  1. 找到bucket所属的point
  2. 仅在planes中以线性方式候选 bucket

要更好地理解该算法,请尝试在纸上跟随它以获得2D等效值(一个由多条线包围并相交的矩形)。

仅检查角投影可确保bucket内任何点的投影也将包含在投影区域内。如果该区域的所有顶点都被覆盖,那么整个区域也将被覆盖。