我正在使用一组平面和一组3D点。
我想找到与我集合中每个点最近的平面。
现在我计算我的平面集中每个平面的一个点的偏差并决定一个是最接近的平面,然后我对我的点集中的每个点重复相同的过程。这很好,但计算成本取决于我拥有的平面数量,所以如果我添加更多的平面(通常我使用超过500个平面),处理时间会增加很多。
有没有更有效的方法来知道距离点最近的平面而无需计算到每个平面的距离?
我正在使用C ++和VTK库实现这一点
使用来自3D跟踪器的信息预先计算平面,并且点由用户定义。
这段代码计算点坐标(体素)并调用DistanceToPlane来计算从体素到所有平面的距离。运行此命令后,vnl_vector距离应该与指向云中每个点的距离最近。
fb://post/{postid}
DistanceToPlane()函数计算从一个点到一个平面的距离,此函数称为每个点的N次(N =平面数)。此函数在VTK库中实现。
由于
答案 0 :(得分:0)
更新更新了算法,使其可用于任意平面
我也在寻找完全相同的问题的解决方案。
该解决方案需要有限的搜索空间(最小/最大x / y / z)。这是一种3D空间分区数据结构,您可以更轻松地查询最近的平面。
预先计算分区数据:
X/Y/Z
buckets
(合理选择大小,例如给定维度的1/20,这将为您提供8000个存储桶)。现在,我们为每个bucket
分配候选项planes
,以测量该点是否在bucket
内。
planes
相交的所有bucket
指定为候选对象。plane
相交的bucket
,计算bucket
角的投影(8个投影)plane
,检查 all 投影和plane
之间是否还有 other bucket
(例如plane
被 other plane
完全覆盖。bucket
个候选对象中。现在查询部分。给定point
:
bucket
所属的point
。planes
中以线性方式仅候选 bucket
。要更好地理解该算法,请尝试在纸上跟随它以获得2D等效值(一个由多条线包围并相交的矩形)。
仅检查角投影可确保bucket
内任何点的投影也将包含在投影区域内。如果该区域的所有顶点都被覆盖,那么整个区域也将被覆盖。