public static Vector3[] ConvexHull (Vector3[] points) {
if (points.Length == 0) return new Vector3[0];
lock (hullCache) {
List<Vector3> hull = hullCache;
hull.Clear ();
#if ASTARDEBUG
for (int i=0;i<points.Length;i++) {
Debug.DrawLine (points[i],points[(i+1)%points.Length],Color.blue);
}
#endif
int pointOnHull = 0;
for (int i=1;i<points.Length;i++) if (points[i].x < points[pointOnHull].x) pointOnHull = i;
int startpoint = pointOnHull;
int counter = 0;
do {
hull.Add (points[pointOnHull]);
int endpoint = 0;
for (int i=0;i<points.Length;i++) if (endpoint == pointOnHull || !Left (points[pointOnHull],points[endpoint],points[i])) endpoint = i;
pointOnHull = endpoint;
counter++;
if (counter > 10000) {
Debug.LogWarning ("Infinite Loop in Convex Hull Calculation");
break;
}
} while (pointOnHull != startpoint);
return hull.ToArray ();
}
}