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); }