如何获得最接近点的轴对齐边界框?
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 的点
PB
:PB = min(max(P,B.lower),B.upper)
- return
P
到 PB
的欧氏长度:return length(P-PB)
要在这些框上构建 BVH:只是选项之一:Embree 确实有一个界面可以在框上构建 BVH,并查询结果。
我有大量的轴对齐边界框,我正在尝试获取从一个点到最近点的欧几里得距离,我已经尝试过曼哈顿距离,但它似乎与“蛮力”不匹配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 的点
PB
:PB = min(max(P,B.lower),B.upper)
- return
P
到PB
的欧氏长度:return length(P-PB)
要在这些框上构建 BVH:只是选项之一:Embree 确实有一个界面可以在框上构建 BVH,并查询结果。