【发布时间】:2010-11-22 01:27:22
【问题描述】:
我有一个 3D 点云,我想有效地查询距离任意点 p(不一定是存储的点云的一部分)在距离 d 内的所有点
查询看起来像
Pointcloud getAllPoints(Point p, float d);
什么加速结构适合这个?范围树似乎只适用于查询矩形体积,而不是球体体积(当然我可以查询球体的边界框,然后整理出所有距离大于 d 的顶点 - 但也许有更好的方法这个??)
谢谢!
根据 Novelocrats 的建议,我尝试定义结构所需的功能:
SearchStructure Create(Set<Point> cloud)
Set<Point> Query(SearchStructure S, Point p, float maxDistance)
SearchStructure Remove(Point p)
SearchStructure Insert(Point p)
SearchStructure Displace(Set<Point> displacement) //where each value describes an offsetVector to the currently present points
通常,在 n 次查询之后,点会发生位移,并且会进行一些(不是很多!)插入和删除。与所有点的边界框相比,偏移向量非常小
【问题讨论】:
-
我认为线性时间创建可能要求太多,并且可能会阻止人们对主要问题提供好的答案。您是否也在不断地查询新的点云?如果新的点云是对现有点云进行更改的结果,那么修改结构可能会更便宜。
-
"Query" 中只有一个 'r'。我建议为后代解决这个问题。
-
Novelocrat:你是对的 - 新的点云是对旧点云的修改,但非常困难(所有点都在移动,每个点都在另一个方向上,此外,可能会添加不存在的新点之前)所以我认为每次重新创建地图将是最好的。在点云移动之前,对于包含 n 个点的地图,大约会有 n 个这样的查询
-
为了与许多算法文本的风格保持一致,您可能希望以过程形式指定所有所需的操作: SearchStructure Create(Set
cloud) Set Query(SearchStructure S, Point p, float maxDistance) 注意非成员样式;这使某人更容易查看此描述并快速了解您希望解决的问题。 -
您应该指定这些结构在程序运行时将如何变化,而不是假定完全重建将是最好的方法。计算几何学家做了一些非常聪明的工作。考虑到他们的主要历史资金来源之一(美国海军研究办公室),移动点将是一个非常有趣的话题。您应该将所有这些信息折叠到问题中。
标签: data-structures 3d geometry distance spatial