我有2个包含点(x,y和z)的列表,并希望找到最近的点。
我认为我需要做这样的事情:
for (int i = 0; i < myarray1.Count; i++)
{
for (int j = 0; j < myarray2.Count; j++)
{
// Calculate the quadratic distance between 2 points (point in index i and j)
// Then store the minimum distance I guess?
}
}
答案 0 :(得分:3)
另一种选择是使用Kd-tree
使用Nearest neighbour search将为您提供O(log n)
复杂度,以便找到与给定点集最近的点,并且您的代码将为O( n log n)
,而不是O (n^2)
。
请参阅here了解如何使用它的实现和示例。
答案 1 :(得分:2)
double min_dist = DOUBLE_MAX;
for (i = 0; i < myarray1.Count; i++)
{
for (j = 0; j < myarray2.Count; j++)
{
curr_dist = dist(a[i],a[j]);
if( min_dist > curr_dist)
{
min_dist = curr_dist;
}
}
}
,其中
double dist(Point a, Point b) {
return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2)+pow(a.z-b.z,2);
}
答案 2 :(得分:1)
计算距离:
double sqr(double x) {return x*x;}
double distance(MyPoint a, MyPoint b) {
return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)+sqr(a.z-b.z);
}
然后在第二个循环中存储到目前为止找到的最小距离:
double d = distance(myarray1[i],myarray2[j]);
if (d<min_d) min_d = d;
其中min_d在开头定义:
double min_d = Float.MAX_VALUE;
答案 3 :(得分:0)
在C#中,我会使用Linq。
首先,我将定义计算两点之间距离的函数,如Emanuelle Paolini的答案所示:
public double Distance(Point p1, Point p2)
{
return Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p1.y) * (p1.y - p1.y) + (p1.z - p1.z) * (p1.z - p1.z));
}
然后我会按如下方式查询两个列表:
var distanceQuery = from p1 in myarray1
from p2 in myarray2
select Dist(p1, p2);
最后我会找回最小距离:
var minimumDistance = distanceQuery.Min();
答案 4 :(得分:0)
公式
Math.sqrt(Math.pow(Math.abs(x1-x2),2) + Math.pow(Math.abs(y1-y2),2)+ Math.pow(Math.abs(z1-z2),2))