我有笛卡尔平面中的点列表和测试点。我想找到最接近测试点的三个点的列表索引。找到这些指数的更好方法是什么?提前感谢您的旅游回复。
===编辑===
我在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);
通过这种方式,我找到了我需要的东西。我不知道这是不是最好的方式,但似乎有效。
答案 0 :(得分:0)
二进制空间分区可能会提供O(log n * log n)的算法复杂度。
现在,您将能够使用树搜索来定位您感兴趣的点周围的空间,从而大大减少距离测试的数量。
棘手的部分是你必须扫描感兴趣点周围的所有邻居边界正方形,因为最近的点可能位于其中任何一个。