Сортировка точек в List'e по наименьшему вектору
В чём суть моего алгоритма: в метод подаётся лист, в котором кол-во элементов гарантированно больше 2, и ни один из них неравен другому, где последний элемент - элемент, который должен быть вставлен в эту же коллекцию, только, где соседние точки, в паре с этой, образуют векторы наименьшей длины.
То есть, если у меня в форме нарисован 4ех-угольник и я добавляю ещё одну точку, то должен получиться 5ти-угольник, который не перечёркнут, то есть все его вершины соед. последовательно. Чтобы это сделать, нужно отсортировать коллекцию, как уже было сказано.
Пример:
Красным - как было до.
Но иногда получается так:
Красным - как получилось.
Серым - как должно было быть.
Вот сам код:
private void SmartSort(List<Point> points)
{
int vector = int.MaxValue,
index = -1;
Point point = points.Last();
points.Remove(point);
foreach (Point _point in points)
{
if (GetVector(_point, point) < vector)
{
vector = GetVector(_point, point);
index = points.IndexOf(_point);
}
}
if (!(index + 1>= 0 && index + 1 < points.Count))
{
points.Add(point);
return;
}
if (index - 1 < 0)
{
points.Add(point);
return;
}
if (GetVector(points[index - 1], point) > GetVector(points[index + 1], point))
{
points.Insert(index + 1, point);
}
else
{
points.Insert(index - 1, point);
}
}
Метод GetVector:
private int GetVector(Point fpoint, Point spoint)
{
return (int)(Math.Pow(fpoint.X - spoint.X, 2) + Math.Pow(fpoint.Y - spoint.Y, 2));
}
Голова уже отказывается думать, надеюсь на вашу помощь.
После исправлений:
private void SmartSort(List<Point> points)
{
int vector = int.MaxValue,
index = -1;
Point point = points.Last();
points.Remove(point);
foreach (Point _point in points)
{
if (GetVector(_point, point) < vector)
{
vector = GetVector(_point, point);
index = points.IndexOf(_point);
}
}
if (index == 0)
{
if (points[index].Y > point.Y)
{
points.Insert(1, point);
return;
}
else
{
points.Add(point);
return;
}
}
if (index + 1 == points.Count)
{
points.Add(point);
return;
}
if (GetVector(points[index - 1], point) > GetVector(points[index + 1], point))
{
points.Insert(index + 1, point);
}
else
{
points.Insert(index - 1, point);
}
}
Ответы (1 шт):
Ошибка здесь:
if (!(index + 1>= 0 && index + 1 < points.Count))
{
points.Add(point);
return;
}
После исправлений:
if (index == 0)
{
if (points[index].Y > point.Y)
Какой смысл в этом сравнении игреков? Если Вы получили индекс равный нулю (начало списка), нужно проверять куда должна быть вставлена новая точка - между первой и второй или между первой и последней. Аналогично - для конца списка.