Сортировать список<Point> ListOfPoints, которые находятся на прямой линии в C#
У нас есть список Points
которые все живут по прямой линии.
var pt1 = new Point(500,100);
var pt2 = new Point(0,0);
var pt3 = new Point(1000,200);
List<Point> ListOfPoints = new List<Point> {pt1, pt2, pt3}
Как мы можем отсортировать эти точки так, чтобы, если мы рассматриваем pt2 (начальную точку этой воображаемой линии) как базовую точку, все другие точки сортируются друг за другом на этой воображаемой прямой линии?
в этом случае после сортировки это должно выглядеть так, как показано ниже
x------------x-----------x
pt2 pt1 pt3
2 ответа
Так как все точки находятся на прямой линии, вы можете отсортировать их по X-координатам, а затем по Y-координате (если линия идет прямо вверх, потому что в этом случае все X-координаты равны):
ListOfPoints.OrderBy(pt => pt.X).ThenBy(pt => pt.Y).ToList();
// Если точки являются Int, то вышеуказанное решение будет работать наверняка, если это плавающая точка, то следующий подход может быть лучше, чтобы избавиться от неприятных случаев.
Vector2 sp = pts.First();
Vector2 ep = pts.Last();
Vector2 plLineVe = (ep - sp);
double len = plLineVe.LengthSqr();
List<double> uVal = new List<double>();
for (int ll = 0; ll < pts.Count; ll++)
{
double u = (pts[ll].x - sp.x) * (ep.x - sp.x) + (pts[ll].y - sp.y) * (ep.y - sp.y);
u = u / len;
uVal.Add(u);
}
uVal.Sort();
double x = sp.x + uVal.First() * plLineVe.x;
double y = sp.y + uVal.First() * plLineVe.y;
Vector2 s = new Vector2(x, y);
x = sp.x + uVal.Last() * plLineVe.x;
y = sp.y + uVal.Last() * plLineVe.y;
Vector2 e = new Vector2(x, y);
Смотрите, pt2(0,0) - начальная точка этой воображаемой линии, следующая точка - pt1, и, наконец, у нас есть pt3 в качестве конечной точки.
Вы должны предоставить более подробную информацию о том, как вы считаете это отсортированным. Все это вписывается в ваш пример.
var sort1 = ListOfPoints.OrderBy(p => p.X)
var sort2 = ListOfPoints.OrderBy(p => p.Y)
var sort3 = ListOfPoints.OrderBy(p => p.X * p.Y)
var sort4 = ListOfPoints.OrderBy(p => p.X).ThenBy(pt => p.Y)
Если эти точки принадлежат декартовой системе координат, я думаю, что вы должны использовать sort1
если у вас нет других требований.