public static void Main()
Console.WriteLine("8 sectors");
Console.WriteLine("P1(0,0) and P2(1,0): {0}", GetDirection(new Point(0, 0), new Point(1, 0)));
Console.WriteLine("P1(0,0) and P2(1,1): {0}", GetDirection(new Point(0, 0), new Point(1, 1)));
Console.WriteLine("P1(0,0) and P2(0,1): {0}", GetDirection(new Point(0, 0), new Point(0, 1)));
Console.WriteLine("P1(0,0) and P2(-1,1): {0}", GetDirection(new Point(0, 0), new Point(-1, 1)));
Console.WriteLine("P1(0,0) and P2(-1,0): {0}", GetDirection(new Point(0, 0), new Point(-1, 0)));
Console.WriteLine("P1(1,1) and P2(-1,-1): {0}", GetDirection(new Point(0, 0), new Point(-1, -1)));
Console.WriteLine("P1(1,1) and P2(0,-1): {0}", GetDirection(new Point(0, 0), new Point(0, -1)));
Console.WriteLine("P1(1,1) and P2(1,-1): {0}", GetDirection(new Point(0, 0), new Point(1, -1)));
Console.WriteLine("Test samples");
Console.WriteLine("P1(1,1) and P2(0,1): {0}", GetDirection(new Point(1, 1), new Point(0, 1)));
Console.WriteLine("P1(1,1) and P2(5,4): {0}", GetDirection(new Point(1, 1), new Point(5, 4)));
Console.WriteLine("P1(1,1) and P2(1,1): {0}", GetDirection(new Point(1, 1), new Point(1, 1)));
static Direction GetDirection(Point start, Point end)
double dx = end.X - start.X;
double dy = end.Y - start.Y;
if (Math.Abs(dx) > Math.Abs(dy))
if (Math.Abs(dy / dx) <= tan_Pi_div_8)
return dx > 0 ? Direction.East : Direction.West;
return dy > 0 ? Direction.Northeast : Direction.Southeast;
return dy > 0 ? Direction.Northwest : Direction.Southwest;
else if (Math.Abs(dy) > 0)
if (Math.Abs(dx / dy) <= tan_Pi_div_8)
return dy > 0 ? Direction.North : Direction.South;
return dx > 0 ? Direction.Northeast : Direction.Northwest;
return dx > 0 ? Direction.Southeast : Direction.Southwest;
return Direction.Undefined;
static readonly double tan_Pi_div_8 = Math.Sqrt(2.0) - 1.0;