Exemple #1
0
        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());
        }