Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 分组点列表_C#_List_Grouping_Points - Fatal编程技术网

C# 分组点列表

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] {

我有一个点列表,我需要按更接近的点分组

这些点是我在这里用红色圈出的白点:

点是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]    {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会更快。