TriangleNet.Tools.RegionIterator.ProcessRegion C# (CSharp) Method

ProcessRegion() private method

Spread regional attributes and/or area constraints (from a .poly file) throughout the mesh.
This procedure operates in two phases. The first phase spreads an attribute and/or an area constraint through a (segment-bounded) region. The triangles are marked to ensure that each triangle is added to the virus pool only once, so the procedure will terminate. The second phase uninfects all infected triangles, returning them to normal.
private ProcessRegion ( Action func ) : void
func Action
return void
        void ProcessRegion(Action<Triangle> func)
        {
            Otri testtri = default(Otri);
            Otri neighbor = default(Otri);
            Osub neighborsubseg = default(Osub);

            Behavior behavior = mesh.behavior;

            // Loop through all the infected triangles, spreading the attribute
            // and/or area constraint to their neighbors, then to their neighbors'
            // neighbors.
            for (int i = 0; i < viri.Count; i++)
            {
                // WARNING: Don't use foreach, viri list gets modified.

                testtri.triangle = viri[i];
                // A triangle is marked as infected by messing with one of its pointers
                // to subsegments, setting it to an illegal value.  Hence, we have to
                // temporarily uninfect this triangle so that we can examine its
                // adjacent subsegments.
                // TODO: Not true in the C# version (so we could skip this).
                testtri.Uninfect();

                // Apply function.
                func(testtri.triangle);

                // Check each of the triangle's three neighbors.
                for (testtri.orient = 0; testtri.orient < 3; testtri.orient++)
                {
                    // Find the neighbor.
                    testtri.Sym(ref neighbor);
                    // Check for a subsegment between the triangle and its neighbor.
                    testtri.SegPivot(ref neighborsubseg);
                    // Make sure the neighbor exists, is not already infected, and
                    // isn't protected by a subsegment.
                    if ((neighbor.triangle != Mesh.dummytri) && !neighbor.IsInfected()
                        && (neighborsubseg.seg == Mesh.dummysub))
                    {
                        // Infect the neighbor.
                        neighbor.Infect();
                        // Ensure that the neighbor's neighbors will be infected.
                        viri.Add(neighbor.triangle);
                    }
                }
                // Remark the triangle as infected, so it doesn't get added to the
                // virus pool again.
                testtri.Infect();
            }

            // Uninfect all triangles.
            foreach (var virus in viri)
            {
                virus.infected = false;
            }

            // Empty the virus pool.
            viri.Clear();
        }