static void FetchEncroachedSegments(NativeArray <float2> pgPoints, int pgPointCount, NativeArray <int2> pgEdges, int pgEdgeCount, ref NativeArray <UEncroachingSegment> encroach, ref int encroachCount, UCircle c) { for (int i = 0; i < pgEdgeCount; ++i) { var edge = pgEdges[i]; var edgeA = pgPoints[edge.x]; var edgeB = pgPoints[edge.y]; // Check if center is along the Edge. if (!math.any(c.center - edgeA) || !math.any(c.center - edgeB)) { continue; } // Get Radius var edgeD = edgeA - edgeB; var edgeM = (edgeA + edgeB) * 0.5f; var edgeR = math.length(edgeD) * 0.5f; if (math.length(edgeM - c.center) > edgeR) { continue; } UEncroachingSegment es = new UEncroachingSegment(); es.a = edgeA; es.b = edgeB; es.index = i; encroach[encroachCount++] = es; } }
static void SplitSegments(ref NativeArray <float2> pgPoints, ref int pgPointCount, ref NativeArray <int2> pgEdges, ref int pgEdgeCount, UEncroachingSegment es) { var sid = FindSegment(pgPoints, pgPointCount, pgEdges, pgEdgeCount, es); if (sid == -1) { return; } var edge = pgEdges[sid]; var edgeA = pgPoints[edge.x]; var edgeB = pgPoints[edge.y]; var split = (edgeA + edgeB) * 0.5f; var neid = 0; if (math.abs(edge.x - edge.y) == 1) { neid = (edge.x > edge.y) ? edge.x : edge.y; InsertVertex(ref pgPoints, ref pgPointCount, split, ref neid); // Add the split segments. var rep = pgEdges[sid]; pgEdges[sid] = new int2(rep.x, neid); for (int i = pgEdgeCount; i > (sid + 1); --i) { pgEdges[i] = pgEdges[i - 1]; } pgEdges[sid + 1] = new int2(neid, rep.y); pgEdgeCount++; } else { neid = pgPointCount; pgPoints[pgPointCount++] = split; pgEdges[sid] = new int2(math.max(edge.x, edge.y), neid); pgEdges[pgEdgeCount++] = new int2(math.min(edge.x, edge.y), neid); } }
static int FindSegment(NativeArray <float2> pgPoints, int pgPointCount, NativeArray <int2> pgEdges, int pgEdgeCount, UEncroachingSegment es) { for (int i = es.index; i < pgEdgeCount; ++i) { var edge = pgEdges[i]; var edgeA = pgPoints[edge.x]; var edgeB = pgPoints[edge.y]; if (math.any(edgeA - es.a) || math.any(edgeB - es.b)) { continue; } return(i); } return(-1); }