Beispiel #1
0
        public static List <Vector2> GiftWrap(List <Vector2> points)
        {
            if (points.Count == 0)
            {
                return(points);
            }

            Vector2 leftMost = points[0];

            foreach (Vector2 point in points)
            {
                if (point.X < leftMost.X)
                {
                    leftMost = point;
                }
            }

            List <Vector2> wrappedPoints = new List <Vector2>();

            Vector2 currPoint = leftMost;
            Vector2 endPoint;

            do
            {
                wrappedPoints.Add(currPoint);
                endPoint = points[0];

                for (int i = 1; i < points.Count; i++)
                {
                    if (points[i] == currPoint)
                    {
                        continue;
                    }
                    if (currPoint == endPoint ||
                        MathUtils.VectorOrientation(currPoint, endPoint, points[i]) == -1)
                    {
                        endPoint = points[i];
                    }
                }

                currPoint = endPoint;
            }while (endPoint != leftMost);

            return(wrappedPoints);
        }