2014-09-15 8 views
0

У меня есть список точек, которые мне нужно группировать по более близким точкам.Список групп

Точки являются белые пятна, которые я обведены красным цветом здесь:

illustration

Очки 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 или другого метода.

+1

Добро пожаловать в Переполнение стека.«У меня есть список точек, которые мне нужно группировать по более близким точкам». - Боюсь, это не очень понятно. Что именно будет желательным выходом для вышеуказанного ввода? – Baldrick

+0

Мне нужно сгруппировать точки, которые ближе друг к другу, то есть есть точки, например 349,69 и 349,70, которые близки. то же самое для 431202 и 431,203. Будут группироваться точки, основанные на их близости друг к другу. – Matias

ответ

2

[EDIT] Что касается проблемы с ближайшими точками, то вы можете перебирать каждую точку и проверять точки, которые ближе к расстоянию R (dist (Point a, Point b) < R). Таким образом, вы можете определить, что, по вашему мнению, близко к заданной точке.

Что касается вашего вопроса на Center of Mass, то вы можете сделать для каждой координаты сумму каждого значения и делить на количество точек. Например:

foreach (var point in Points) 
{ 
    xCenterOfMass += point.X; 
    yCenterOfMass += point.Y; 
} 

xCenterOfMass /= Points.Count(); 
yCenterOfMass /= Points.Count(); 
+0

'foreach' в C#, а не' for'. – Mephy

+0

Ответчик хотел найти решение для сортировки точек по расстоянию, а не как найти центр масс. – omni

+0

Теперь я включил проблему ближайших пунктов и изменил foreach. – muzio

0

Если я правильно понял, что вы пытаетесь сделать, (немного трудно, потому что ваша формулировка может быть лучше) вы хотите заказать список по расстоянию каждой точки на некоторое неизвестное место.

Ваш вопрос был не ясен, поэтому я собираюсь предположить, что вы хотите, чтобы они были сгруппированы по номеру по расстоянию до места происхождения. В этом случае LINQ будет выглядеть примерно так:

var output = points.OrderBy(p1 => Math.Pow(p1.X, 2) + Math.Pow(p1.Y, 2)); 

где points ваш List<Point>.

Если вы хотите вместо того, чтобы заказать их по расстояние до произвольной точки, это выглядело бы вместо того, чтобы, как это:

var output = points.OrderBy(p1 => Math.Sqrt(Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y -p2.Y, 2))); 

где p2 является точкой вы хотите найти расстояние от, и где points является вашим List<Point>.

Источники:

http://msdn.microsoft.com/en-us/library/system.drawing.point(v=vs.110).aspx

http://msdn.microsoft.com/en-us/library/bb549422.aspx

http://en.wikipedia.org/wiki/Distance#Geometry

+0

Для небольшого повышения производительности опустите sqrt. Он не изменит порядок. –

+0

Ах ты прав. Было бы быстрее опустить sqrt на случай расстояния до места происхождения. – omni

Смежные вопросы