internal static void RemoveDuplicatePoints(ref NativeArray <double2> points, ref int pointCount, ref NativeArray <int> duplicates, ref int duplicateCount)
        {
            TessLink link = TessLink.CreateLink(pointCount);

            for (int i = 0; i < pointCount; ++i)
            {
                for (int j = i + 1; j < pointCount; ++j)
                {
                    if (math.distance(points[i], points[j]) < kEpsilon)
                    {
                        link.Link(i, j);
                    }
                }
            }

            duplicateCount = 0;
            for (var i = 0; i < pointCount; ++i)
            {
                var j = link.Find(i);
                if (j != i)
                {
                    duplicateCount++;
                    points[j] = math.min(points[i], points[j]);
                }
            }

            // Find Duplicates.
            if (duplicateCount != 0)
            {
                var prevPointCount = pointCount;
                pointCount = 0;
                for (var i = 0; i < prevPointCount; ++i)
                {
                    var j = link.Find(i);
                    if (j == i)
                    {
                        duplicates[i]        = pointCount;
                        points[pointCount++] = points[i];
                    }
                    else
                    {
                        duplicates[i] = -1;
                    }
                }

                // Update Duplicates.
                for (int i = 0; i < prevPointCount; ++i)
                {
                    if (duplicates[i] < 0)
                    {
                        duplicates[i] = duplicates[link.Find(i)];
                    }
                }
            }

            TessLink.DestroyLink(link);
        }
Ejemplo n.º 2
0
        internal static TessLink CreateLink(int count, Allocator allocator)
        {
            TessLink link = new TessLink();

            link.roots = new NativeArray <int>(count, allocator);
            link.ranks = new NativeArray <int>(count, allocator);

            for (int i = 0; i < count; ++i)
            {
                link.roots[i] = i;
                link.ranks[i] = 0;
            }
            return(link);
        }
Ejemplo n.º 3
0
 internal static void DestroyLink(TessLink link)
 {
     link.ranks.Dispose();
     link.roots.Dispose();
 }