public static Mesh DelaunayTriangulate(this PlainShape shape, IntGeom iGeom) { int n = shape.points.Length; var vertices = new Vector3[n]; for (int i = 0; i < n; ++i) { var v = iGeom.Float(shape.points[i]); vertices[i] = new Vector3(v.x, v.y, 0); } var extraPoints = new NativeArray <IntVector>(0, Allocator.Temp); var delaunay = shape.Delaunay(0, extraPoints, Allocator.Temp); extraPoints.Dispose(); var nTriangles = delaunay.Indices(Allocator.Temp); delaunay.Dispose(); var mesh = new Mesh { vertices = vertices, triangles = nTriangles.ToArray() }; nTriangles.Dispose(); return(mesh); }
public static List ConvexPolygons(this PlainShape self, Allocator allocator, IntGeom intGeom) { var delaunay = self.Delaunay(Allocator.Temp); var list = delaunay.ConvexPolygons(intGeom, allocator); delaunay.Dispose(); return(list); }
public NativeArray <Vector3> Vertices(Allocator allocator, IntGeom intGeom, float z = 0) { int n = points.Count; var result = new NativeArray <Vector3>(n, allocator); for (int i = 0; i < n; ++i) { var p = intGeom.Float(points[i]); result[i] = new Vector3(p.x, p.y, z); } return(result); }
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()); }
internal Validator(IntGeom intGeom, float maxArea) { this.intGeom = intGeom; this.maxArea = 2f * maxArea; }
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()); }