如何获得最接近点的轴对齐边界框?

How to get the closest Axis-Aligned Bounding Box to a point?

我有大量的轴对齐边界框,我正在尝试获取从一个点到最近点的欧几里得距离,我已经尝试过曼哈顿距离,但它似乎与“蛮力”不匹配force”通过用欧几里德距离迭代所有这些结果。任何有效的方法? 干杯

我提出以下解决方案。你有如下 5 个矩形,你的点 P 在 (7,4)

如果您构建两个按水平边缘和垂直边缘排序的排序列表,您将得到:

List1 (Horizontal)
0  ((4,0),(8,0))->Rec5       index 0
1  ((4,1),(8,1))->Rec5       index 1
2  ((4,2),(6,2))->Rec1       index 2
3  ((8,3),(9,3))->Rec3       index 3
4  ((4,4),(6,4))->Rec1       index 4
4  ((10,4),(13,4))->Rec4     index 5
5  ((1,5),(6,5))->Rec2       index 6
6  ((10,6),(13,6))->Rec4     index 7
7  ((8,7),(9,7))->Rec3       index 8
8  ((1,8),(6,8))->Rec2       index 9

List2 (Vertical)
1  ((1,5),(1,8))->Rec2       index 0
4  ((4,0),(4,1))->Rec5       index 1
4  ((4,2),(4,4))->Rec4       index 2
6  ((6,2),(6,4))->Rec1       index 3
6  ((6,5),(6,8))->Rec2       index 4
8  ((8,0),(8,1))->Rec5       index 5
8  ((8,3),(8,7))->Rec3       index 6
9  ((9,3),(9,7))->Rec3       index 7
10 ((10,4,(10,6))->Rec4      index 8
13 ((13,4,(13,6))->Rec4      index 9

现在您可以在 Py = 4 上的水平列表上进行二进制搜索。这是您在两个方向上向外工作的起始索引。 Px = 7 也一样。

在您的水平列表中,您发现 H_index = 4 (Rec1)

在您的垂直列表中,您发现 V-Index = 4 (Rec2)

还没有匹配,向四面八方移动一个中心(重复此步骤直到匹配一个)

H_index = 3 (Rec3)
H_index = 5 (Rec4)
V_index = 3 (Rec1)
V_index = 5 (Rec5)

我们有一场比赛->Rec1 (H_index = 4, V_index = 3)

如果你想找到所有相等的,你还没有完成。

Px 和 rec1 之间的 x 距离 = 1。您需要在此限制内包括所有矩形。

UpperLimit = 7 + 1 = 8
LowerLimit = 7 - 1 = 6

这给出 V_index 3 到 8。对于它们中的每一个,检查 Py 是否介于或等于该行的 y 值。

6  ((6,2),(6,4))->Rec1       index 3      YES
6  ((6,5),(6,8))->Rec2       index 4      NO
8  ((8,0),(8,1))->Rec5       index 5      NO
8  ((8,3),(8,7))->Rec3       index 6      YES

因此也找到了 Rec3 作为解决方案

Py 和 rec1 之间的 y 距离 = 0。您需要在此限制内包括所有矩形。

UpperLimit = 4 + 0 = 4
LowerLimit = 4 - 0 = 4

这给出 H_index 4 到 5。对于它们中的每一个,检查 Px 是否介于或等于该行的 x 值。

4  ((4,4),(6,4))->Rec1       index 4     NO
4  ((10,4),(13,4))->Rec4     index 5     NO

没有找到其他解决方案,我们完成了:Rec1 和 Rec3 最接近。

此解决方案对于多达 100.000 个矩形来说足够快。当你谈论 milj 时。的矩形,你将需要使用线段树。

  • 在您的输入框上构建 BVH(边界体积层次结构)。
  • 通过这个BVH递归遍历一个点:在每一步
    • 如果节点是叶子:
      • 计算此叶中点到框的距离
      • 跟踪找到的最近交叉路口
    • 其他
      • 计算点到每个 children
      • 的距离
      • (可选但推荐:)按距离
      • 对 children 进行排序
      • 如果child 距离 > 已找到的最近距离:剔除它;
      • 否则:递归到 child

计算点 P 和框 B 之间的(欧氏)距离:

  • 计算方框中最接近 P 的点 PBPB = min(max(P,B.lower),B.upper)
  • return PPB 的欧氏长度:return length(P-PB)

要在这些框上构建 BVH:只是选项之一:Embree 确实有一个界面可以在框上构建 BVH,并查询结果。