/* * /// <summary> * /// * /// </summary> * /// <param name="ps"></param> * /// <returns></returns> * private Stack<Coordinate> ReverseStack(Stack<Coordinate> ps) * { * // Do a manual reverse of the stack * int size = ps.Count; * var tempArray = new Coordinate[size]; * for (int i = 0; i < size; i++) * tempArray[i] = ps.Pop(); * var returnStack = new Stack<Coordinate>(size); * foreach (Coordinate obj in tempArray) * returnStack.Push(obj); * return returnStack; * } */ /// <summary> /// /// </summary> /// <param name="c1"></param> /// <param name="c2"></param> /// <param name="c3"></param> /// <returns> /// Whether the three coordinates are collinear /// and c2 lies between c1 and c3 inclusive. /// </returns> private static bool IsBetween(Coordinate c1, Coordinate c2, Coordinate c3) { if (CGAlgorithms.ComputeOrientation(c1, c2, c3) != 0) { return(false); } if (c1.X != c3.X) { if (c1.X <= c2.X && c2.X <= c3.X) { return(true); } if (c3.X <= c2.X && c2.X <= c1.X) { return(true); } } if (c1.Y != c3.Y) { if (c1.Y <= c2.Y && c2.Y <= c3.Y) { return(true); } if (c3.Y <= c2.Y && c2.Y <= c1.Y) { return(true); } } return(false); }
/// <summary> /// /// </summary> /// <param name="o"></param> /// <param name="p"></param> /// <param name="q"></param> /// <returns></returns> private static int PolarCompare(Coordinate o, Coordinate p, Coordinate q) { double dxp = p.X - o.X; double dyp = p.Y - o.Y; double dxq = q.X - o.X; double dyq = q.Y - o.Y; int orient = CGAlgorithms.ComputeOrientation(o, p, q); if (orient == CGAlgorithms.CounterClockwise) { return(1); } if (orient == CGAlgorithms.Clockwise) { return(-1); } // points are collinear - check distance double op = dxp * dxp + dyp * dyp; double oq = dxq * dxq + dyq * dyq; if (op < oq) { return(-1); } if (op > oq) { return(1); } return(0); }
/// <summary> /// /// </summary> /// <param name="c"></param> /// <returns></returns> private static Stack <Coordinate> GrahamScan(Coordinate[] c) { var ps = new Stack <Coordinate>(c.Length); ps.Push(c[0]); ps.Push(c[1]); if (c.Length > 2) { ps.Push(c[2]); } for (int i = 3; i < c.Length; i++) { var p = ps.Pop(); while ( ps.Count > 0 /*(IsEmpty Hack)*/ && CGAlgorithms.ComputeOrientation(ps.Peek(), p, c[i]) > 0) { p = ps.Pop(); } ps.Push(p); ps.Push(c[i]); } ps.Push(c[0]); return(ps); }