Ejemplo n.º 1
0
        /*
         * /// <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);
        }
Ejemplo n.º 2
0
            /// <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);
            }
Ejemplo n.º 3
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);
        }