从数组中找出最近的2个点

时间:2015-11-28 10:38:02

标签: java nearest-neighbor

我正在尝试从阵列中获得距离另一个点最近的2个点。

在这里,我只得到了最好的。 (i + = 6,因为我将POSITION和COLOR保存到数组中)但是我怎么能得到2.最接近的?

nIdx = 0;
float dst1;
float dst2 = sqrt(vert[0] - x) + sqrt(vert[1] - y);
for (int i = 6; i < vert.length; i+=6) {
    dst1 = sqrt(vert[i] - x) + sqrt(vert[i+1] - y);
    if (dst2 > dst1) {
        nIdx = i;
        dst2 = dst1;
    }
}

我试着这样做:

if (dst2 > dst1) {
    n2Idx = nIdx;
    nIdx = i;
    dst2 = dst1;
}

这在某些情况下确实有效。但是,如果nIdx确实挥动拳头索引。 n2Idx不会更改为nIdx的最后一个。

嗯,我认为我做错了一些错误:

float dst1 = sqrt(vert[0] - x) + sqrt(vert[1] - y);
float dst2 = sqrt(vert[6] - x) + sqrt(vert[7] - y);
for (int i = 0; i < vert.length; i+=6) {
    float dst = sqrt(vert[i] - x) + sqrt(vert[i+1] - y);
    //noinspection StatementWithEmptyBody
    if (dst >= dst2) {
    } else if (dst <= dst1) {
        dst2 = dst1;
        dst1 = dst;
    } else {
        dst2 = dst;
    }
}

1 个答案:

答案 0 :(得分:1)

dst1dst2视为有序对,即dst1较小且dst2较大(或两个距离相等)。当您遍历您的点列表时,请计算候选距离dst,然后执行以下操作之一:

  • 如果dst大于或等于dst2,则不执行任何操作
  • 如果dst小于或等于dst1,请将dst1移至dst2,并将dst分配给dst1
  • 否则,请将dst分配给dst2

完成循环后dst1dst2将有两个最小距离:

index ind1 = 0;
index ind2 = 6;
float dst1 = sqrt(vert[ind1] - x) + sqrt(vert[ind1+1] - y);
float dst2 = sqrt(vert[ind2] - x) + sqrt(vert[ind2+1] - y);
// Make sure dst1 and dst2 are ordered to begin with
if (dst2 < dst1) {
    float td = dst1;
    dst1 = dst2;
    dst2 = td;
    ind1 = 6;
    ind2 = 0;
}
// Start loop at 12, because we have processed the first two indexes
for (int i = 12 ; i < vert.length; i += 6) {
    float dst = sqrt(vert[i] - x) + sqrt(vert[i+1] - y);
    if (dst >= dst2) {
        continue;
    }
    if (dst <= dst1) {
        dst2 = dst1;
        ind2 = ind1;
        dst1 = dst;
        ind1 = i;
    } else {
        dst2 = dst;
        ind2 = i;
    }
}