比较列表中的点

时间:2013-12-31 18:27:35

标签: c# .net winforms

我有一个简单的点List<Point>列表,我用鼠标填充它。就像,当我单击鼠标时,该位置将添加到列表中。问题是新位置添加在列表的底部。我想要做的是,当我单击鼠标时,搜索列表中的所有现有点并将最近的点返回到鼠标位置,然后在该点之后插入新点。

我一直在网上搜索几个小时,我似乎无法找到解决方案。任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:5)

List<>类包含an .Insert() method来做到这一点。当您搜索列表并找到“最近”元素(但是您定义了该逻辑)时,您可以在列表中获得the index of该对象。然后在该索引之后插入新的。类似的东西:

var closestPoint = FindClosestPoint(listOfPoints, newPoint);
var index = listOfPoints.IndexOf(closestPoint);
listOfPoints.Insert(index + 1, newPoint);

获得最近点本身应该是几何的简单问题。平面上有两个X / Y坐标。它们之间的距离是the square root of the sum of the squares of the axes。所以你只需要那个值最小的元素。像这样:

var closestPoint = listOfPoints
                   .Select(p => new {
                       Point = p,
                       Distance = Math.Sqrt(
                           Math.Pow(Math.Abs(p.X - closestPoint.X), 2) +
                           Math.Pow(Math.Abs(p.Y - closestPoint.Y), 2)
                       )
                   })
                   .OrderByDesc(p => p.Distance)
                   .First();