0

我有一大堆 Axis-Aligned Bounding Boxes,我试图获得从一个点到最近一个点的欧几里得距离,我尝试过曼哈顿距离,但它似乎与迭代的“蛮力”结果不匹配用欧几里得距离覆盖所有这些。有什么有效的方法吗?干杯

4

2 回答 2

1

我提出以下解决方案。您有如下 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)

我们有一个 match->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 = 0 之间的 y 距离。您需要在此限制内包含所有矩形。

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. 矩形,您将需要使用线段树。

于 2021-12-04T09:21:31.307 回答
-1
  • 在输入框上构建 BVH(边界体积层次结构)。
  • 通过这个BVH递归遍历一个点:在每一步
    • 如果节点是叶子:
      • 计算这片叶子中点到框的距离
      • 跟踪找到的最近路口
    • 别的
      • 计算点到每个孩子的距离
      • (可选但推荐:)按距离对孩子进行排序
      • 如果子距离>最近已找到的距离:剔除它;
      • 否则:递归到那个孩子

P计算点和框之间的(欧几里得)距离B

  • 计算PB框中最接近 P 的点:PB = min(max(P,B.lower),B.upper)
  • P返回到的欧几里得长度PBreturn length(P-PB)

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

于 2021-12-20T21:52:21.120 回答