Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Box n维两个轴对齐框之间的最小距离_Box_Euclidean Distance - Fatal编程技术网

Box n维两个轴对齐框之间的最小距离

Box n维两个轴对齐框之间的最小距离,box,euclidean-distance,Box,Euclidean Distance,问题:如何有效计算n维中两个轴对齐框之间的最小距离 方框格式:方框A和B由其最小和最大点A_min、A_max、B_min、B_max给出,每个点都是一个n维向量。也就是说,这些方框可以用数学方法写成以下笛卡尔乘积: A=[A_min(1),A_max(1)]x[A_min(2),A_max(2)]x。。。x[A_min(n),A_max(n)] B=[B_最小值(1),B_最大值(1)]x[B_最小值(2),B_最大值(2)]x。。。x[B_最小值(n),B_最大值(n)] 图片:这是一张用2

问题:如何有效计算n维中两个轴对齐框之间的最小距离

方框格式:方框A和B由其最小和最大点A_min、A_max、B_min、B_max给出,每个点都是一个n维向量。也就是说,这些方框可以用数学方法写成以下笛卡尔乘积:

A=[A_min(1),A_max(1)]x[A_min(2),A_max(2)]x。。。x[A_min(n),A_max(n)]

B=[B_最小值(1),B_最大值(1)]x[B_最小值(2),B_最大值(2)]x。。。x[B_最小值(n),B_最大值(n)]

图片:这是一张用2D展示创意的图片:



注意:注意:我问了这个问题,并自己回答,因为这个问题(通常是n维形式)似乎在stackoverflow中消失了,即使在这么多年之后。这个问题的好答案在互联网上很难找到。在谷歌搜索之后,我最终不得不自己解决这个问题,我在这里发帖是为了避免未来的人们遇到同样的麻烦。

盒子之间的最小距离由以下公式给出:

dist = sqrt(||u||^2 + ||v||^2)
在哪里

在向量上按入口进行最大化(即,max(0,w)表示将向量w的所有负项替换为零,但保持正项不变)。符号| | w | |表示向量w的欧几里德范数(条目平方和的平方根)

这不需要任何逐案分析,并且适用于任何维度,无论框相对于彼此位于何处

python代码:

import numpy as np

def boxes_distance(A_min, A_max, B_min, B_max):
    delta1 = A_min - B_max
    delta2 = B_min - A_max
    u = np.max(np.array([np.zeros(len(delta1)), delta1]), axis=0)
    v = np.max(np.array([np.zeros(len(delta2)), delta2]), axis=0)
    dist = np.linalg.norm(np.concatenate([u, v]))
    return dist

框之间的最小距离由下式给出:

dist = sqrt(||u||^2 + ||v||^2)
在哪里

在向量上按入口进行最大化(即,max(0,w)表示将向量w的所有负项替换为零,但保持正项不变)。符号| | w | |表示向量w的欧几里德范数(条目平方和的平方根)

这不需要任何逐案分析,并且适用于任何维度,无论框相对于彼此位于何处

python代码:

import numpy as np

def boxes_distance(A_min, A_max, B_min, B_max):
    delta1 = A_min - B_max
    delta2 = B_min - A_max
    u = np.max(np.array([np.zeros(len(delta1)), delta1]), axis=0)
    v = np.max(np.array([np.zeros(len(delta2)), delta2]), axis=0)
    dist = np.linalg.norm(np.concatenate([u, v]))
    return dist