【问题标题】:Combine Nearest Convex Polygons组合最近的凸多边形
【发布时间】:2016-03-27 00:12:09
【问题描述】:

我有一个点云数组(一组已确定在自己的区域内的点)。

我们的目标是结合这些单独的集群,它们要么是

我。相交

二。在彼此之间的最小距离内

Check ii 使这变得更加困难。为了快速处理这些点云,我正在创建 AABB(沿 X 轴对齐的轴对齐边界框)。

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

  1. 为每个点云创建 AABB
  2. 对于每个 AABB,检查它们是否重叠,方法是将它们投影到随机轴上,然后按照它们落在这条线上的位置 o(nlog(n)) 对这些线性投影进行排序。然后,我浏览此列表以使用 SAT 检查交叉点 O(N)。大多数 AABB 的线性投影不会重叠,因此不会相交,而那些我可以手动检查的(因为 1D 中没有重叠保证没有相交,但反之则不然)。

最后一部分是我卡住的地方。完成上述一维投影是为了避免 O(n^2) 成对检查交叉点。但是为了组合在某个阈值内但不相交的凸多边形,我看不到 O(N^2) 成对检查的方法。

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

如果您使用我从 1 和 2 中的步骤,您可以假设剩余的点云/AABB 不相交。

编辑

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

【问题讨论】:

  • 你能告诉我AABB的定义吗?
  • 轴对齐边界框(沿 X 轴对齐)。 studiofreya.com/3d-math-and-physics/…
  • 我觉得你的问题听起来太花哨了,这也意味着令人困惑。基本上,您正在检查常规框是否彼此太近,但您尚未将框定义为集群中的单个点(您所说的点云)或集群的中心,其半径是您问题中的阈值。你能澄清你的问题的描述吗?干得好 AABB:D
  • 是的。我将 AABB(轴对齐边界框)添加到这些点云中。我想检查交叉点,或者是否有任何框在与另一个框的最小距离内。我可以在 nlogn 中完成第一部分。第二部分我不能没有 N^2 解决方案。不过,我试图让这一点更清楚!
  • 看看this。如果你像我一样懒惰,你可以使用this。你也可以看看this 咯咯笑,谢谢你的问题,我学到了很多。 GJ AABB。

标签: algorithm geometry nearest-neighbor convex


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为为一组给定的相交框寻找相交框的问题称为“空间连接”。有TOUCH等专用算法。 但是,我发现如果使用空间索引,简单地遍历框并检查重叠是非常有效的。这意味着对于每个 for 框,您都可以查询相交框的空间索引。 传统上,您可以为此使用 R-Tree 或 X-Tree。

    就我个人而言,我使用PH-Tree(我自己的 Java 实现)得到了非常好的结果,例如使用大约 1,200,000 个 3D 框(6000 个相交框)的数据集,加载索引和执行查询总共需要大约 6 秒台式机。

    编辑

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 2011-06-09
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      相关资源
      最近更新 更多