Сортировка точек в 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 шт):

Автор решения: Igor

Ошибка здесь:

    if (!(index + 1>= 0 && index + 1 < points.Count))
    {
        points.Add(point);
        return;
    }

После исправлений:

    if (index == 0)
    {
        if (points[index].Y > point.Y)

Какой смысл в этом сравнении игреков? Если Вы получили индекс равный нулю (начало списка), нужно проверять куда должна быть вставлена новая точка - между первой и второй или между первой и последней. Аналогично - для конца списка.

→ Ссылка