Сортировка точек в порядке следования против часовой стрелки - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, снова задачка с курсов, нужна ваша помощь. Необходимо отсортировать точки в порядке следования против часовой стрелки,

считая первой ту, что находится на 3:00

. Дан такой код, который менять нельзя:
private static void Main()
{
    var array = new[]
    {
        new Point { X = 1, Y = 0 },
        new Point { X = -1, Y = 0 },
        new Point { X = 0, Y = 1 },
        new Point { X = 0, Y = -1 },
        new Point { X = 0.01, Y = 1 }
    };
    Array.Sort(array, new ClockwiseComparer());
    foreach (Point e in array)
        Console.WriteLine("{0} {1}", e.X, e.Y);
}
 
public class Point
{
    public double X;
    public double Y;
}
Необходимо написать ClockwiseComparer. Также есть подсказка: "Используйте функцию Math.Atan2(y, x) возвращающую угол радиус-вектора (x, y) в диапазоне (-PI..PI]" Вот что у меня получилось:
public class ClockwiseComparer : IComparer
        {
            public int Compare(object x, object y)
            {
                var point1 = (Point)x;
                var point2 = (Point)y;
                
                return Math.Atan2(point1.Y, point1.X).CompareTo(Math.Atan2(point2.Y, point2.X));
            }
        }
В итоге получаю вывод: 0 -1 1 0 0.01 1 0 1 -1 0 То есть, первой считается точка на 6 часов. А должно быть так(первая точка на 3 часа): 1 0 0.01 1 0 1 -1 0 0 -1 Как можно исправить код?

Решение задачи: «Сортировка точек в порядке следования против часовой стрелки»

textual
Листинг программы
public int Compare(object x, object y)
    {
        var p1 = x as Point;
        var p2 = y as Point;
        return Math.Atan2(-p1.Y, -p1.X).CompareTo(Math.Atan2(-p2.Y, -p2.X));
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы