public static List <Vector3> Simplify(List <Vector3> points, float minArea, bool isClosed, bool useCopy = true) { const int minPointsCount = 10; var pts = useCopy ? new List <Vector3>(points) : points; if (isClosed) { int prevPointCount; int index = 0; do { prevPointCount = pts.Count; while (index < pts.Count && pts.Count >= minPointsCount) { Vector2 p1 = pts[index]; Vector2 p2 = pts[(index + 1) % pts.Count]; Vector2 p3 = pts[(index + 2) % pts.Count]; var area = MeshHelper.GetTriangleArea(p1, p2, p3); if (area < minArea) { pts.RemoveAt((index + 1) % pts.Count); index += 2; } else { index++; } } index %= pts.Count; } while (prevPointCount != pts.Count); } else { int prevPointCount; do { prevPointCount = pts.Count; int index = 0; while (index < pts.Count - 2 && pts.Count >= minPointsCount) { Vector2 p1 = pts[index]; Vector2 p2 = pts[index + 1]; Vector2 p3 = pts[index + 2]; var area = MeshHelper.GetTriangleArea(p1, p2, p3); if (area < minArea) { pts.RemoveAt(index + 1); index += 2; } else { index++; } } } while (prevPointCount != pts.Count); } return(pts); }