如何在距离另一个点最近的点数组中找到点
Posted
技术标签:
【中文标题】如何在距离另一个点最近的点数组中找到点【英文标题】:How to find the Point in an array of points which is closest to another point 【发布时间】:2019-10-06 06:31:36 【问题描述】:PolygonPoints
是一个用于渲染多边形的点数组。我还有一个 LINQ 函数,它返回最接近 0,0 的点。
如何修改此 LINQ 函数将 PolygonPoints 数组中的 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);
【问题讨论】:
请澄清:您是否在问如何在 知道鼠标位置的同时找到离鼠标位置最近的点(实际上,这是一个数学问题,因为您确实有正在工作的 LINQ 查询),或者当不知道鼠标位置(实际上,问题变成了“如何获得鼠标位置?”),或两者兼而有之? 你的意思是请复杂化? 这是我不知道该怎么做的。我也忍不住双关语不理解任何人都没有想到只是将其复制并粘贴到一个新项目中。然后将其可视化。然后总结。如何使 linq 函数不查找零,而是查找鼠标当前位置?当我喂它我的鼠标当前位置时,它不适用于我的鼠标当前位置。因此关于鼠标当前位置的问题。 作为提示,在 WPF 中,您可以通过-
运算符获得两个点的差,它为您提供了一个向量:var v = p2 - p1
。 Vector 有一个 Length 属性。任务:找到长度最小的向量。
可以说我们可以删除第一段之后的所有内容吗?我想这只是几个Point
s,仅此而已。
【参考方案1】:
使这更容易的是编写更小的函数。单独它们更容易理解,然后将它们放在一起时会更容易阅读,因为部分查询包含其他函数的名称。如果您使用您能想到的最具描述性的变量名称,也会有很大帮助。
接下来,您提到您已经有一个函数可以在数组中找到最接近 (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
中最接近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
。 (如果searchIn
为空,First()
将导致异常。您可以先验证该参数,如果数组为空,则抛出ArgumentException
。这样更容易判断问题所在。)
如果你想找到原始数组中最近点的索引,那就是
Array.IndexOf(arrayOfPoints, somePoint)
【讨论】:
以上是关于如何在距离另一个点最近的点数组中找到点的主要内容,如果未能解决你的问题,请参考以下文章
两个不同 Numpy 数组中的点之间的最小欧几里得距离,不在