找到最近的三个点

时间:2012-10-10 09:43:13

标签: vertex nearest-neighbor

我有笛卡尔平面中的点列表和测试点。我想找到最接近测试点的三个点的列表索引。找到这些指数的更好方法是什么?提前感谢您的旅游回复。

===编辑===

我在C ++中找到了一个解决方案。首先我创建一个向量:

typedef struct
{
  int iIndex;
  double dSqrDistance;
} IndexedDistance;

std::vector<IndexedDistance> xDistanceVector;

然后是一个对其元素进行排序的函数

bool compareIndexedDistance(IndexedDistance xD1, IndexedDistance xD2)
{
  return (xD1.dSqrDistance < xD2.dSqrDistance);
}

然后在循环中我计算所有距离,然后我对它们进行排序,最后我采用前三个元素:

IndexedDistance xDistanceElement;
for (int i = 0; i < xPointList.size(); i++)
{
  dSqrDistance = xPointList.at(i).sqrDistance(xTestPoint);
  xDistanceElement.iIndex = i;
  xDistanceElement.dSqrDistance = dSqrDistance;
  xDistanceVector.push_back(xDistanceElement);
}

std::sort(xDistanceVector.begin(), xDistanceVector.end(), compareIndexedDistance);
xDistanceVector.resize(3);

通过这种方式,我找到了我需要的东西。我不知道这是不是最好的方式,但似乎有效。

1 个答案:

答案 0 :(得分:0)

二进制空间分区可能会提供O(log n * log n)的算法复杂度。

  1. 确定点集的边界。 Infinum和supremum点将为您提供一个轴对齐的方形,其中包含集合中的所有点。
  2. 将任意轴分割为两个边界。为每个方格单独列出包含的点数。将每个边界方块链接到父方块。
  3. 重复拆分边界正方形(步骤2),直到相应的包含点列表相当小,以便利用穷举搜索。
  4. 现在,您将能够使用树搜索来定位您感兴趣的点周围的空间,从而大大减少距离测试的数量。

    棘手的部分是你必须扫描感兴趣点周围的所有邻居边界正方形,因为最近的点可能位于其中任何一个。