数组坐标之间的欧式距离

时间:2018-12-09 09:07:08

标签: c# arrays point euclidean-distance

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

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您必须使用2个for循环才能实现这一目标。

此外,您还希望将这些点之间的欧式距离保持不变。

答案 2 :(得分:0)

您可能想两次遍历数组。

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));
}

通过这种方式,我可以随时重用和重新排序计算,因为我只需要移动一行即可。请注意,您始终可以仅将float用作参数而不是locals,但是在此示例中,我认为这种方式将使其更具可读性。

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

答案 3 :(得分:0)

  handleInputChange(event) {
      this.setState({ value: event.target.value });
   }
  getObj = obj => {
  let newString = [];
  let returnString = "";
  let inputval = this.state.value
   inputval = inputval.toLowerCase()
  .split(' ')
  .map((s) => s.charAt(0).toUpperCase() + s.substring(1))
  .join(' ');
  const { data } = this.state;

  data.map(item => {
  const checkString = item.hotelinfo.hotelsearch.realname;
  newString = checkString.split(" ");
  if (newString.includes(inputval)) {
    returnString = checkString;
  }});

return obj.hotelinfo.hotelsearch.realname === returnString;
}; 
handleSearch = () => {
 const { data } = this.state;
 const filteredItems = data.filter(this.getObj);
 if (filteredItems.length === 0) {
 return false
 }else{
    return this.setState({data : eval(filteredItems)}, () => console.log("ITEMS : ",this.state.data) )
//In this part new data will be replaced by default data and the number of default Items is 400. By filtering in this part console.log show me 100 items.For the text search the filtering will be done among 100 result not 400 result.I want every search be done among 400 items that is my default number of item. 
  }
}; 

我通过键入以下代码解决了问题 k = points.length()