У меня был удар в этом, хотя это, вероятно, не является фантастически эффективным способ сделать что-то; ссылка в ответе Конрада кажется хорошим местом для изучения.
Я не совсем уверен, как вы определяете «внутри диапазона», поэтому я принял простой расчет расстояния.
// Set up some points
List<Point> Points = new List<Point>();
Points.Add(new Point(0, 0));
Points.Add(new Point(0, 1));
Points.Add(new Point(0, 2));
// Distance
int maxDistance = 1;
// Replace as appropriate
Func<Point, Point, int, bool> myDistanceFunction = delegate(Point p1, Point p2, int range)
{
// Same coordinate.
if (p1 == p2)
return true;
int xDelta = p1.X - p2.X;
int yDelta = p1.Y - p2.Y;
double distance = Math.Sqrt(xDelta * xDelta + yDelta * yDelta);
return (distance <= range);
};
// Loop through all points and calculate distance to all other points.
var Results = Points.Select(firstPoint => new
{
TargetPoint = firstPoint,
PointsInRange = Points
.Where(secondPoint =>
(secondPoint != firstPoint) && // Will you allow same coordinates?
myDistanceFunction(secondPoint, firstPoint, maxDistance))
});
// Spit the results out.
foreach (var result in Results)
{
Console.WriteLine("Point {0} - Points within {1} unit(s):", result.TargetPoint, maxDistance);
foreach (var point in result.PointsInRange)
{
Console.WriteLine("\t{0}", point);
}
}
Выход:
Point {X=0,Y=0} - Points within 1 unit(s):
{X=0,Y=1}
Point {X=0,Y=1} - Points within 1 unit(s):
{X=0,Y=0}
{X=0,Y=2}
Point {X=0,Y=2} - Points within 1 unit(s):
{X=0,Y=1}
Там место для улучшения, например, он не чувствует себя умным, чтобы вычислять расстояния для пар точек дважды, и я не, если вы позволите дублировать координаты, но там может быть что-то полезное.
Вы также можете написать функцию расстояния как выражение lamba, хотя я не уверен, что это яснее.
Func<Point, Point, int, bool> myDistanceFunction =
(
(p1, p2, range) => Math.Sqrt(
((p1.X - p2.X) * (p1.X - p2.X)) +
((p1.Y - p2.Y) * (p1.Y - p2.Y))
) <= range
);
Linq-2-objects? Entity Framework-? Некоторые другие провайдеры Linq? – jessehouwing
Если бы у вас были точки 'A = (0,0)', 'B = (0,1)' и 'C = (0,2)', что бы вы ожидали? 'B' - расстояние 1 от' A' и 'C', но' A' - расстояние 2 от 'C'. Должны ли они быть в одной группе? –
, если у меня есть A = (0,0), B = (0,1) и C = (0,2), и заданная дельта 1, я хотел бы иметь разную группу для всех точек, имеющих такое расстояние –