结合最近的凸多边形

时间:2016-03-27 00:12:09

标签: algorithm geometry nearest-neighbor convex

我有一系列的pointclouds(已经确定在他们自己的区域中的一组点)。

目标是组合

这些单独的群集

我。相交的

II。距彼此最小距离

检查ii使这更难。为了快速处理这些pointcloud,我创建了AABB(轴对齐的边界框,沿X轴对齐)。

我目前的方法是使用分离轴定理的一些属性:

  1. 为每个pointcloud创建AABB
  2. 对于每个AABB,通过将它们投影到随机轴上然后将这些线性投影按它们落在该行o(nlog(n))的位置进行排序来检查它们是否重叠。然后我通过这个列表来检查使用SAT的交叉点O(N)。大多数AABB的线性投影不会重叠,因此不会相交,我可以手动检查(因为1D中没有重叠可以保证没有交点,但反之则不然)。
  3. 最后一部分是我被困的地方。进行上述1D投影以避免对交叉点进行O(n ^ 2)成对检查。但是为了组合在一定阈值但不相交的凸多边形,我无法看到围绕O(N ^ 2)成对检查的方法。

    有没有办法构建一些树或图形来组合彼此之间一定距离内的所有凸多边形而不检查每个成对组合?

    如果使用你使用我的步骤1& 2,你可以假设剩余的pointclouds / AABB不相交。

    修改

    可能的解决方案是将threshold/2添加到AABB宽度和高度,并检查交叉点。如果它们相交,那么我可以检查两个实际的交叉点(对于AABB来说很快),以及两者之间的最小距离。

2 个答案:

答案 0 :(得分:0)

我最终使用了随机轴的法线,并检查了两个方向上1D的重叠,这大大加快了我的算法速度(如果沿着一个轴有聚类,则移除减速)。

对于距离阈值,保证交叉点所需的所有边上的AABB距离填充的最小值为A / 2。这捕获了AABB仅在x或y方向上分离的所有情况(对角线情况需要A * sqrt(2)/ 4)

答案 1 :(得分:0)

我认为找到一组给定交叉框的交叉框的问题称为“空间连接”。有专门的算法,如TOUCH。 但是,我发现如果使用空间索引,只需遍历框并检查重叠就非常有效。这意味着对于每个框,您查询相交框的空间索引。 经典地说,你可以使用R树或X树。

我个人使用PH-Tree(我自己的Java实现)获得了非常好的结果,例如,数据集大约有1,200,000个3D框(6000个交叉框),加载索引并执行查询总共大约6个桌面计算机上的秒数。

修改

我不确定复杂程度,但似乎低于O(n * log n)。