java - 从数组中找到最近的 2 个点

标签 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;
    }
}

最佳答案

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

  • 如果 dst 大于或等于 dst2,则不执行任何操作
  • 如果dst小于或等于dst1,则将dst1移动到dst2,并分配 >dstdst1
  • 否则,将 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;
    }
}

关于java - 从数组中找到最近的 2 个点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33970368/

相关文章:

java - 当 Queue 中的消息为零时,确定何时终止 SpringBoot 中的 Jms Listener

java - Map 的 HashMap 同步与增值

python - 为半径 r 内的所有点查询 "Annoy"索引

algorithm - 检索有限范围内的 k-最近球体

java - 在 K-Nearest 算法中获取最短的 'K' 距离 (Java)

mysql - 如何对 "N-nearest neighbors?"执行多维搜索

java - 为什么我们不能将 Cloneable 作为抽象类而不是将其作为接口(interface)?

java - 在路径 ""src/test/resources/上找不到文件”

java - 与 JMeter 相比,Blazemeter 结果是否正确?

c++ - 如何计算 opencv (c++) 中标记组件(二值图像)之间的成对距离