数组中坐标之间的欧氏距离
Euclidean distance between the coordinates in the array
我用c#计算欧式距离。
Point[] points = new Point[100];
我有我在此创建的点的坐标array.I想计算所有点之间的距离
for (int i = 1; i < k+1; i++)
{
X1 = points[i].X;
X2 = points[i + 1].X;
Y1 = points[i].Y;
Y2 = points[i + 1].Y;
result = Math.Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2));
}
用这段代码我计算了点之间的距离(例如:a点和b点之间的距离,c点和d点之间的距离等)但是我无法计算a点和c点之间的距离或点 b 和 b 我想计算这个数组中所有点之间的距离。我该怎么做?
你必须使用 2 个 for 循环来实现。
此外,您还希望在某处保留这些点之间的欧氏距离。
您必须使用 2 个循环。第一个循环为 X1 赋值,第二个循环为 X2 赋值。
这允许计算数组中不连续的两点之间的欧氏距离。
您可能想遍历数组两次。
Point[] points = new Point[100];
for(int i = 0; i < points.Length; i++)
for (int j = points.Length - 1; j >= i; j--)
{
float distance = 0;
if(i != j)
distance = CalculateDistance(points[i], points[j]);
// Do more stuff here
}
显然,您可以简单地 运行 两个等长的 for 循环,但这会给您两次相同的结果。当 i
和 j
具有相同的值翻转时(i = 10
、j = 15
和后来的 i = 15
和 j = 10
),你做同样的计算得到相同的结果。为了防止我的第二个循环只有 运行 大约一半的值不重做计算。
CalculateDistance 方法与您之前编写的代码完全相同,在我的例子中如下:
private static float CalculateDistance(Point point1, Point point2)
{
float X1 = point1.X;
float X2 = point1.Y;
float Y1 = point2.X;
float Y2 = point2.Y;
return (float)Math.Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2));
}
这样我就可以随时重用和重新排序我的计算,因为我只需要移动一行。请注意,您始终可以只使用浮点数而不是局部变量作为参数,但我觉得这种方式会使本例中的代码更具可读性。
当距离相等时,我也跳过了计算,因为比较的是相同的值。
public void Euclidea()
{
double result;
int X1,X2,Y1,Y2;
for (int i = 1; i < k+1; i++)
{
X1 = points[i].X;
Y1 = points[i].Y;
for (int j = 0; j < k; j++)
{
X2 = points[j + 1].X;
Y2 = points[j + 1].Y;
result = Math.Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2));
}
}
}
我输入这段代码解决了这个问题
k=points.length()
我用c#计算欧式距离。
Point[] points = new Point[100];
我有我在此创建的点的坐标array.I想计算所有点之间的距离
for (int i = 1; i < k+1; i++)
{
X1 = points[i].X;
X2 = points[i + 1].X;
Y1 = points[i].Y;
Y2 = points[i + 1].Y;
result = Math.Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2));
}
用这段代码我计算了点之间的距离(例如:a点和b点之间的距离,c点和d点之间的距离等)但是我无法计算a点和c点之间的距离或点 b 和 b 我想计算这个数组中所有点之间的距离。我该怎么做?
你必须使用 2 个 for 循环来实现。
此外,您还希望在某处保留这些点之间的欧氏距离。
您必须使用 2 个循环。第一个循环为 X1 赋值,第二个循环为 X2 赋值。
这允许计算数组中不连续的两点之间的欧氏距离。
您可能想遍历数组两次。
Point[] points = new Point[100];
for(int i = 0; i < points.Length; i++)
for (int j = points.Length - 1; j >= i; j--)
{
float distance = 0;
if(i != j)
distance = CalculateDistance(points[i], points[j]);
// Do more stuff here
}
显然,您可以简单地 运行 两个等长的 for 循环,但这会给您两次相同的结果。当 i
和 j
具有相同的值翻转时(i = 10
、j = 15
和后来的 i = 15
和 j = 10
),你做同样的计算得到相同的结果。为了防止我的第二个循环只有 运行 大约一半的值不重做计算。
CalculateDistance 方法与您之前编写的代码完全相同,在我的例子中如下:
private static float CalculateDistance(Point point1, Point point2)
{
float X1 = point1.X;
float X2 = point1.Y;
float Y1 = point2.X;
float Y2 = point2.Y;
return (float)Math.Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2));
}
这样我就可以随时重用和重新排序我的计算,因为我只需要移动一行。请注意,您始终可以只使用浮点数而不是局部变量作为参数,但我觉得这种方式会使本例中的代码更具可读性。
当距离相等时,我也跳过了计算,因为比较的是相同的值。
public void Euclidea()
{
double result;
int X1,X2,Y1,Y2;
for (int i = 1; i < k+1; i++)
{
X1 = points[i].X;
Y1 = points[i].Y;
for (int j = 0; j < k; j++)
{
X2 = points[j + 1].X;
Y2 = points[j + 1].Y;
result = Math.Sqrt((X1 - X2) * (X1 - X2) + (Y1 - Y2) * (Y1 - Y2));
}
}
}
我输入这段代码解决了这个问题 k=points.length()