算法:如何找到最近的元素,具有坐标和维度

标签 algorithm sorting bounds

我有一个包含对象的数组,每个对象包含 x、y、宽度和高度。例如arr[{10,20,200,300},{20,30,100,200},…] 现在我想在这个数组中找到最接近给定对象的对象,同时考虑到它的边界。 我怎么能做到这一点,例如在右边有一个 x 优先级(找到位于给定对象右边的 x 轴上最近的对象)?

最佳答案

假设您的对象的中心是 (x,y)宽度 w , 高度 h .

数组中的对象(我想是矩形)的中心是 (xi, yi)和宽度 wi , hi .

您的对象将从右边缘、上边缘或下边缘连接到其他对象,其坐标为:

R1 - R2: ((x+(w/2)), (y-(h/2))) - ((x+(w/2))), ((y+(h/2)))

T1 - T2: ((x-(w/2)), (y+(h/2))) - ((x+(w/2))), ((y+(h/2)))

B1 - B2: ((x-(w/2)), (y-(h/2))) - ((x+(w/2))), ((y-(h/2)))

数组中的对象可能有从它们相似的左边缘、上边缘或下边缘开始的最短距离

Li1 - Li2: ((xi-(wi/2)), (yi-(hi/2))) - ((xi-(wi/2))), ((yi+(hi/2)))

Ti1 - Ti2: ((xi-(wi/2)), (yi+(hi/2))) - ((xi+(wi/2))), ((yi+(hi/2)))

Bi1 - Bi2: ((xi-(wi/2)), (yi-(hi/2))) - ((xi+(wi/2))), ((yi-(hi/2)))

然后,

distance = infinite;
shortest = null;
for all object in array
    find min distance for
        R2 to [Li1,Li2] line
        R1 to [Li1,Li2] line
        R2 to [Bi1,Bi2] line
        R1 to [Bi1,Bi2] line
        R2 to [Ti1,Ti2] line
        R1 to [Ti1,Ti2] line

        T2 to [Li1,Li2] line
        T1 to [Li1,Li2] line
        T2 to [Bi1,Bi2] line
        T1 to [Bi1,Bi2] line
        T2 to [Ti1,Ti2] line
        T1 to [Ti1,Ti2] line

        B2 to [Li1,Li2] line
        B1 to [Li1,Li2] line
        B2 to [Bi1,Bi2] line
        B1 to [Bi1,Bi2] line
        B2 to [Ti1,Ti2] line
        B1 to [Ti1,Ti2] line

    if minDistance < distance
        distance = minDistance
        shortest = i
end for

您可以根据数组中对象与您的对象的相对位置跳过其中一些计算。例如,如果 Ti1 < B1 , 你不需要计算 [Bi1,Bi2] line零件。

我觉得这个解决方案非常直截了当&dummy,并且会受到数学家的粗暴批评,但我想看看接受情况。

关于算法:如何找到最近的元素,具有坐标和维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27083049/

相关文章:

c++ - 如何分配一个二维 vector ?

Java 应用程序使用 openCSV CSVReader 读取 csv 文件时出错... java.lang.ArrayIndexOutOfBoundsException

ruby-on-rails - ruby:对符号数组进行排序

java - 在 Java 中,类型变量的边界只能出现在类型变量声明中,对吗?

python - Scipy 优化 Curve_fit 边界错误

java - 使用排列查找字符串中所有可能的组合

java - 递归列出 Integer Arraylist 中的所有排列和组合

java - 两个排序数组的最大对数

java - Comparator.comparing().reversed() 反转所有早期的比较器?

sorting - 如何根据数值对 slice 进行排序,如果数值等于则按字母顺序排序