如何在最接近另一个点的点数组中找到点

时间:2019-05-19 20:07:30

标签: c# wpf linq c#-4.0

PolygonPoints是用于渲染多边形的点数组。我还有一个LINQ函数,该函数返回最接近0,0的点。

如何修改此LINQ功能以将多边形CLOSEST中的x,y返回到当前鼠标位置

LINQ

    var PointClosestToZero = PolygonPoints.Aggregate(
    (minPoint, next) =>
         (minPoint.X * minPoint.X + minPoint.Y * minPoint.Y)
         < (next.X * next.X + next.Y * next.Y) ? minPoint : next);

1 个答案:

答案 0 :(得分:4)

编写较小的函数使此操作变得容易。单独地,它们更容易理解,然后将它们放在一起时,它会更容易阅读,因为查询的一部分包含其他函数的名称。如果您使用可以想到的最具描述性的变量名称,那么它也很有帮助。

接下来,您提到您已经具有在数组中最接近(0,0)的点的功能。如果要在最接近鼠标的数组中找到该点,则不需要其他函数。两者是相同的。您正在尝试在最接近另一个点的数组中找到该点。该点可能是(0,0)或鼠标位置。

首先,如果所有这些都取决于计算两点之间的距离,请为此编写一个函数。这将比在查询中内联包含要容易得多:

double DistanceBetweenPoints(Point p1, Point p2)
{
    return Math.Sqrt(Math.Pow((p2.X - p1.X), 2) + Math.Pow(p2.Y - p1.Y, 2));
}

或具有内置功能:

double DistanceBetweenPoints(Point p1, Point p2)
{
    return (p2 - p1).Length;
}

接下来,如果PolygonPointsPoint的数组,而mousePositionPoint,那么这将为您提供PolygonPoints中最接近{{ 1}}:

mousePosition

第一个public Point FindClosest(Point[] searchIn, Point compareTo) { return searchIn .Select(p => new {point = p, distance = DistanceBetweenPoints(p, compareTo)}) .OrderBy(distances => distances.distance) .First().point; } 产生一组匿名对象,每个对象包含一个Select及其与比较点的距离。

然后Point命令找到距离最小的那个。

OrderBy选择第一个(最小距离),而First()仅从该匿名对象中选择.point。 (如果Point为空,则First()会导致异常。您可以先验证该参数,如果数组为空,则抛出searchIn。这样,更容易分辨出问题出在哪里。 )

如果要查找原始数组中最接近点的索引,则为

ArgumentException