【问题标题】:Euclidean distance between the coordinates in the array数组中坐标之间的欧几里得距离
【发布时间】:2018-12-09 09:07:08
【问题描述】:

我在 c# 中计算欧几里得距离。

Point[] points = new Point[100];

我有我在这个数组中创建的点的坐标。我想计算所有点之间的距离。

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 我想计算这个数组中所有点之间的距离。我该怎么做?

【问题讨论】:

  • 你的代码需要做两件事: 1)选择两个点来计算距离; 2)计算这些点之间的距离。听起来问题确实出在第 1 部分,而不是第 2 部分。使这一点更清晰的一种方法是将距离计算分离为一种方法,例如double CalculateDistance(Point p1, Point p2)。然后,您可以将所有精力都集中在确定要比较的点上。 (提示:您可能需要两个循环。我还建议使用基于 0 的计数器,因为这就是数组等在 C# 中自然工作的方式。)

标签: c# arrays point euclidean-distance


【解决方案1】:

您必须使用 2 个循环。第一个循环给 X1 赋值,第二个循环给 X2 赋值。

这允许计算数组中不连续的两点之间的欧几里得距离。

【讨论】:

    【解决方案2】:

    您必须使用 2 个 for 循环来实现。

    您还想在某处保留这些点之间的欧几里得距离。

    【讨论】:

      【解决方案3】:

      你可能想要遍历数组两次。

      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 循环,但这将给您两次相同的结果。当ij 翻转相同的值时(i = 10j = 15 和更高版本的i = 15j = 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));
      }
      

      这样我可以随时重复使用和重新排序我的计算,因为我只需要移动一行。请注意,您始终可以只使用浮点数作为参数而不是局部变量,但我觉得这种方式会使其在此示例中更具可读性。

      当距离相等时我也跳过了计算,因为比较了相同的值。

      【讨论】:

        【解决方案4】:
        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()

        【讨论】:

          猜你喜欢
          • 2016-02-15
          • 2011-01-29
          • 2013-02-12
          • 2023-03-12
          • 1970-01-01
          • 2021-01-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多