예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
        }
예제 #4
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());
        }
예제 #5
0
 internal Validator(IntGeom intGeom, float maxArea)
 {
     this.intGeom = intGeom;
     this.maxArea = 2f * maxArea;
 }
예제 #6
0
        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());
        }