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);
答案 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;
}
接下来,如果PolygonPoints
是Point
的数组,而mousePosition
是Point
,那么这将为您提供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