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

时间:2014-11-22 22:02:43

标签: algorithm sorting bounds

我有一个带有对象的数组,每个对象包含x,y,width和height。例如arr [{10,20,200,300},{20,30,100,200},...]现在我想在这个数组中找到最接近给定对象的对象,并考虑其边界。 我怎么能实现这一点,例如右边的x优先级(找到位于给定对象右侧的x轴上最近的对象)?

1 个答案:

答案 0 :(得分:1)

假设您的对象的中心位于(x,y),宽度为w,高度为h

数组中的对象(矩形,我猜)具有中心(xi, yi)和宽度wihi

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

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部分。

我觉得这个解决方案非常简单明了,并且会受到数学家们的粗暴批评,但我想尝试看看这些招待会。