public static List ConvexPolygons(this Delaunay self, IntGeom intGeom, Allocator allocator) { int n = self.triangles.Count; var dynamicList = new DynamicList(self.points.Count, n >> 1, allocator); var visited = new NativeArray <bool>(n, Allocator.Temp); for (int i = 0; i < n; ++i) { if (visited[i]) { continue; } var first = self.triangles[i]; visited[i] = true; var convexPolygon = new ConvexPolygon(first); while (convexPolygon.edges.Count > 0) { var edge = convexPolygon.edges.Last(); convexPolygon.edges.RemoveLast(); if (visited[edge.neighbor]) { continue; } var next = self.triangles[edge.neighbor]; if (convexPolygon.Add(edge, next)) { visited[edge.neighbor] = true; } } var iPoints = convexPolygon.Points(Allocator.Temp); var points = intGeom.Float(iPoints, Allocator.Temp); var polygon = new Polygon(points, allocator); dynamicList.Add(polygon); iPoints.Dispose(); points.Dispose(); convexPolygon.Dispose(); } visited.Dispose(); return(dynamicList.Convert()); }
public static List MakeCentroidNet(this PlainShape self, Allocator allocator, IntGeom intGeom, float maxEdge, float maxArea = 0, float minArea = 0, bool onlyConvex = false) { long iEdge = intGeom.Int(maxEdge); var delaunay = self.Delaunay(iEdge, Allocator.Temp); float aMaxArea; if (maxArea > 0) { aMaxArea = maxArea; } else { aMaxArea = 0.4f * maxEdge * maxEdge; } delaunay.Tessellate(intGeom, aMaxArea); var iMinArea = intGeom.SqrInt(minArea); var shape = delaunay.MakeCentroidNet(Allocator.Temp, iMinArea, onlyConvex); delaunay.Dispose(); int n = shape.layouts.Length; var dynamicList = new DynamicList(8 * n, n, allocator); for (int i = 0; i < n; ++i) { var iPath = shape.Get(i); var path = intGeom.Float(iPath, Allocator.Temp); var polygon = new Polygon(path, Allocator.Temp); dynamicList.Add(polygon); } shape.Dispose(); return(dynamicList.Convert()); }