bool Flip(NativeArray <float2> points, ref NativeArray <int> stack, ref int stackCount, int a, int b, int x) { int y = OppositeOf(a, b); if (y < 0) { return(true); } if (b < a) { int tmp = a; a = b; b = tmp; tmp = x; x = y; y = tmp; } if (FindConstraint(a, b) != -1) { return(true); } if (ModuleHandle.IsInsideCircle(points[a], points[b], points[x], points[y])) { if ((2 + stackCount) >= stack.Length) { return(false); } stack[stackCount++] = a; stack[stackCount++] = b; } return(true); }
internal bool ApplyDelaunay(NativeArray <float2> points, NativeArray <int2> edges) { NativeArray <int> stack = new NativeArray <int>(m_NumPoints * (m_NumPoints + 1), m_Allocator); int stackCount = 0; var valid = true; PrepareDelaunay(edges, m_NumEdges); for (int a = 0; valid && (a < m_NumPoints); ++a) { UStar star = m_Stars[a]; for (int j = 1; j < star.pointCount; j += 2) { int b = star.points[j]; if (b < a) { continue; } if (FindConstraint(a, b) >= 0) { continue; } int x = star.points[j - 1], y = -1; for (int k = 1; k < star.pointCount; k += 2) { if (star.points[k - 1] == b) { y = star.points[k]; break; } } if (y < 0) { continue; } if (ModuleHandle.IsInsideCircle(points[a], points[b], points[x], points[y])) { if ((2 + stackCount) >= stack.Length) { valid = false; break; } stack[stackCount++] = a; stack[stackCount++] = b; } } } var flipFlops = m_NumPoints * m_NumPoints; while (stackCount > 0 && valid) { int b = stack[stackCount - 1]; stackCount--; int a = stack[stackCount - 1]; stackCount--; int x = -1, y = -1; UStar star = m_Stars[a]; for (int i = 1; i < star.pointCount; i += 2) { int s = star.points[i - 1]; int t = star.points[i]; if (s == b) { y = t; } else if (t == b) { x = s; } } if (x < 0 || y < 0) { continue; } if (!ModuleHandle.IsInsideCircle(points[a], points[b], points[x], points[y])) { continue; } EdgeFlip(a, b); valid = Flip(points, ref stack, ref stackCount, x, a, y); valid = valid && Flip(points, ref stack, ref stackCount, a, y, x); valid = valid && Flip(points, ref stack, ref stackCount, y, b, x); valid = valid && Flip(points, ref stack, ref stackCount, b, x, y); valid = valid && (--flipFlops > 0); } stack.Dispose(); return(valid); }