Сортировка точек в порядке следования против часовой стрелки - C#
Формулировка задачи:
Здравствуйте, снова задачка с курсов, нужна ваша помощь.
Необходимо отсортировать точки в порядке следования против часовой стрелки, Необходимо написать В итоге получаю вывод:
0 -1
1 0
0.01 1
0 1
-1 0
То есть, первой считается точка на 6 часов.
А должно быть так(первая точка на 3 часа):
1 0
0.01 1
0 1
-1 0
0 -1
Как можно исправить код?
считая первой ту, что находится на 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));
}
}Решение задачи: «Сортировка точек в порядке следования против часовой стрелки»
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));
}