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); }
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); }
internal static void DestroyLink(TessLink link) { link.ranks.Dispose(); link.roots.Dispose(); }