コード例 #1
0
        public static void Repair_Connectivity(
            this PM_Maze maze,
            Random rand
            )
        {
            List <HashSet <Vec2i> > islands = maze.Islands(rand);

            while (islands.Count > 1)
            {
                HashSet <Vec2i> selectedIsland = islands.Pop_Random_Item(rand);

                HashSet <Vec2i> allOtherNodes = maze.CellsPositions_All_Set();
                allOtherNodes.ExceptWith(selectedIsland);

                HashSet <Vec2i> frontier = new HashSet <Vec2i>();
                foreach (var cell in selectedIsland)
                {
                    //HashSet<PM_V2> inactiveEdges = maze.

                    bool         isFrontier = false;
                    List <Vec2i> geomNei    = maze.Cell_GeometricNeighbors_List(cell);
                    foreach (var nei in geomNei)
                    {
                        if (selectedIsland.Contains(nei) == false)
                        {
                            isFrontier = true;
                            break;
                        }
                    }

                    if (isFrontier)
                    {
                        frontier.Add(cell);
                    }
                }

                Vec2i           selectedNode  = frontier.Random_Item(rand);
                HashSet <Vec2i> possibleJoins = maze.Cell_GeometricNeighbors_Set(selectedNode);
                possibleJoins.ExceptWith(selectedIsland);

                Vec2i joinedNode = possibleJoins.Random_Item(rand);

                maze.OP_AddEdge(new UEdge2i(selectedNode, joinedNode));

                int joinedIslandIndex = -1;
                for (int i = 0; i < islands.Count; i++)
                {
                    if (islands[i].Contains(joinedNode))
                    {
                        joinedIslandIndex = i;
                        break;
                    }
                }
                HashSet <Vec2i> joinedIsland = islands[joinedIslandIndex];

                islands.RemoveAt(joinedIslandIndex);

                joinedIsland.UnionWith(selectedIsland);

                islands.Add(joinedIsland);
            }
        }