Example #1
0
        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;
            }
        }
Example #2
0
        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);
            }
        }
Example #3
0
 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);
 }