【问题标题】:find three nearest point找到三个最近的点
【发布时间】:2012-09-30 17:57:03
【问题描述】:

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

=== 编辑 ===

我在 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);

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

【问题讨论】:

    标签: vertex nearest-neighbor


    【解决方案1】:

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

    1. 确定点集的边界。 Infinum 和 supremum 点将为您提供一个轴对齐的正方形,其中包含集合中的所有点。
    2. 任意轴将边界方块一分为二。为每个正方形制作一个单独的包含点列表。将每个边界方块链接到父方块。
    3. 重复分割边界方块(第 2 步),直到对应的包含点列表足够小,可以利用穷举搜索。

    现在您将能够使用树搜索来定位兴趣点周围的空间,从而大大减少距离测试的次数。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 2019-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      相关资源
      最近更新 更多