C# 分组点列表
我有一个点列表,我需要按更接近的点分组 这些点是我在这里用红色圈出的白点: 点是X和Y坐标,这是一个按X排序的样本C# 分组点列表,c#,list,grouping,points,C#,List,Grouping,Points,我有一个点列表,我需要按更接近的点分组 这些点是我在这里用红色圈出的白点: 点是X和Y坐标,这是一个按X排序的样本 + [0] {X = 435 Y = 347} System.Drawing.Point + [1] {X = 435 Y = 348} System.Drawing.Point + [2] {X = 434 Y = 347} System.Drawing.Point + [3] {
+ [0] {X = 435 Y = 347} System.Drawing.Point
+ [1] {X = 435 Y = 348} System.Drawing.Point
+ [2] {X = 434 Y = 347} System.Drawing.Point
+ [3] {X = 434 Y = 348} System.Drawing.Point
+ [4] {X = 434 Y = 349} System.Drawing.Point
+ [5] {X = 433 Y = 201} System.Drawing.Point
+ [6] {X = 433 Y = 202} System.Drawing.Point
+ [7] {X = 433 Y = 348} System.Drawing.Point
+ [8] {X = 432 Y = 149} System.Drawing.Point
+ [9] {X = 432 Y = 200} System.Drawing.Point
+ [10] {X = 432 Y = 201} System.Drawing.Point
+ [11] {X = 432 Y = 202} System.Drawing.Point
+ [12] {X = 432 Y = 203} System.Drawing.Point
+ [13] {X = 431 Y = 148} System.Drawing.Point
+ [14] {X = 431 Y = 149} System.Drawing.Point
+ [15] {X = 431 Y = 200} System.Drawing.Point
+ [16] {X = 431 Y = 201} System.Drawing.Point
+ [17] {X = 431 Y = 202} System.Drawing.Point
+ [18] {X = 431 Y = 203} System.Drawing.Point
+ [19] {X = 430 Y = 148} System.Drawing.Point
+ [20] {X = 430 Y = 149} System.Drawing.Point
+ [21] {X = 349 Y = 69} System.Drawing.Point
+ [22] {X = 349 Y = 70} System.Drawing.Point
我需要将所有较近的点分组,然后计算重心(实际上我的问题是将所有较近的点放在一起)
我知道有一个公式可以计算两个点之间的欧几里德距离,这样就可以找到(使用范围)离给定点最近的点,但不确定在C#中如何使用LINQ或其他方法。关于最近点问题,您可以迭代每个点,并检查距离R(dist(点a,点b)
foreach (var point in Points)
{
xCenterOfMass += point.X;
yCenterOfMass += point.Y;
}
xCenterOfMass /= Points.Count();
yCenterOfMass /= Points.Count();
如果我正确理解了你想做的事情,(有点困难,因为你的措辞可能会更好),你想按每个点到某个未知位置的距离排列一个列表 您的问题不清楚,因此我假设您希望按照到原点的距离对它们进行分组。在这种情况下,LINQ看起来像这样:
var output = points.OrderBy(p1 => Math.Pow(p1.X, 2) + Math.Pow(p1.Y, 2));
var output = points.OrderBy(p1 => Math.Sqrt(Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y -p2.Y, 2)));
其中点
是您的列表
如果您希望按照到任意点的距离对它们进行排序,则会显示如下:
var output = points.OrderBy(p1 => Math.Pow(p1.X, 2) + Math.Pow(p1.Y, 2));
var output = points.OrderBy(p1 => Math.Sqrt(Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y -p2.Y, 2)));
其中,p2
是要查找距离的点,而点
是您的列表
资料来源:
已知的分组点解决方案是k均值聚类算法
这也将为您提供每组的重心。欢迎来到Stack Overflow。“我有一个点列表,我需要按更接近的点分组。”-我恐怕这不是很清楚。上述输入的期望输出究竟是什么?我需要将彼此距离较近的点分组,也就是说,有一些点,例如349,69和349,70距离较近。与431202和431203相同。在C#中,将根据点之间的接近程度对点进行分组
foreach
,而不是for
。询问者想要的是按距离对点进行排序的解决方案,而不是如何找到质心。我现在已经包括了最近点问题,并更改了foreach。为了稍微提高性能,省略sqrt。它不会改变订单。啊,你说得对。在距离原点的情况下省略sqrt会更快。