【问题标题】:Efficient way to find set of objects inside or intersecting bounding box?找到内部或相交边界框的一组对象的有效方法?
【发布时间】:2016-02-24 13:42:18
【问题描述】:

我有一组 3d 对象 {obj1,obj2,.....objn} 和一个 3D 边界框 B 。现在要找到在边界框 B 内或与边界框 B 相交的对象集,我正在使用下面的代码,其计算时间为 O(n)

     for(int i = 0; i < n; i++){
            obj = objectsArray[i];
            objBox = obj.BoundingBox;
            if ((B.Max.Z > objBox.Max.Z || B.Max.Z > objBox.Min.Z) && (B.Min.Z < objBox.Max.Z || B.Min.Z < objBox.Min.Z) && (B.Max.X > objBox.Max.X || B.Max.X > objBox.Min.X) && (B.Min.X < objBox.Max.X || B.Min.X < objBox.Min.X) && (B.Max.Y > objBox.Max.Y || B.Max.Y > objBox.Min.Y) && (B.Min.Y < objBox.Max.Y || B.Min.Y < objBox.Min.Y)) {
                // obj is  inside or overlapping box B
                ObjectsInsideB.add(obj) 
             } else{
                // obj out of box B
             }
      }
// objBox.Max bounding box vertex at maximum end
// objBo.min bounding box vertex at minimum end

我正在寻找有效的方法来计算它,以减少 O(n) 搜索,有什么办法吗?由于边界框 B 每帧都在变化,因此对于 100000 个对象来说非常慢。

【问题讨论】:

  • 物体坐标是否也发生了变化?还是只是移动的边界框?
  • 只是边界框在移动,在所有对象中,有 10% 的对象在移动,其余的都是静态的。

标签: algorithm optimization data-structures


【解决方案1】:

如果我理解正确,您可能希望使用多维索引并对它们执行窗口查询。多维度索引是专门为此构建的。 简单的标准多索引是四叉树/八叉树、kd-tree 和 R-Tree。 如果您有很多对象,并且您的对象正在移动,您可能需要查看专门的移动对象树。例如 PH-Tree,here (Java) 是我编写的一个实现。

【讨论】:

  • 感谢 tilmannz 的回复,我会在分析您的解决方案后更新您。
【解决方案2】:

您可以通过升序 X、Y 和 Z 坐标对静态对象进行排序(因此您有 3 个相同对象的列表)并进行二分搜索以找到适合 X、Y、Z 范围内的对象(您只需搜索第一个和最后一个),然后将这些结果相交。

对于移动的物体,它有点棘手,但如果对移动速度有限制,您仍然可以将物体粗略分类,您只需每 X 帧重新计算一次。

【讨论】:

  • 感谢 biziclop,我会尝试你的方法并提出优缺点
【解决方案3】:

当我曾经不得不做类似的事情时,我为我的点创建了一组固定的边界框,(所以每个点正好在 1 个框中),然后当给出对边界框 B 的查询时(不一定在我的set),我根据B的坐标找到了共同包含B(一般是8个)的bounding box集合,并快速查看其中的点是否在B中。

如果 B 的大小是固定的,则为固定集中的框使用该大小。

例如,在 3 空间中,n 个点随机分布在某个大盒子中,如果我们通过将每个维度分成 k 块来形成我们的子盒子网格,那么每个盒子将有大约 (1/k)^3 个点。

【讨论】:

  • 听起来不错,我会执行你的方法,然后我面对的利弊回来。
  • @GoodnezEverywer 进展如何?
猜你喜欢
  • 2013-10-05
  • 2011-01-17
  • 2016-12-21
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多