public static List <Vec2i> Cells_Connected_To_Cell__List(
            this PM_Maze maze,
            Vec2i cell
            )
        {
            List <Vec2i> neighbors = new List <Vec2i>();

            Directions_Ortho_2D directions = maze.Q_Cell_Directions(cell);

            if (directions.HasFlag(Directions_Ortho_2D.U))
            {
                neighbors.Add(cell.To_Up());
            }
            if (directions.HasFlag(Directions_Ortho_2D.D))
            {
                neighbors.Add(cell.To_Down());
            }
            if (directions.HasFlag(Directions_Ortho_2D.L))
            {
                neighbors.Add(cell.To_Left());
            }
            if (directions.HasFlag(Directions_Ortho_2D.R))
            {
                neighbors.Add(cell.To_Right());
            }

            return(neighbors);
        }
        public static int Cell__Centrality(
            this PM_Maze maze,
            int x,
            int y
            )
        {
            int centrality = 0;
            Directions_Ortho_2D cellDirections = maze.Q_Cell_Directions(x, y);

            if (cellDirections.HasFlag(Directions_Ortho_2D.U))
            {
                centrality++;
            }
            if (cellDirections.HasFlag(Directions_Ortho_2D.D))
            {
                centrality++;
            }
            if (cellDirections.HasFlag(Directions_Ortho_2D.L))
            {
                centrality++;
            }
            if (cellDirections.HasFlag(Directions_Ortho_2D.R))
            {
                centrality++;
            }
            return(centrality);
        }
Пример #3
0
        public static char[,] EncodeDirectionsTableToCharTable(Directions_Ortho_2D[,] directionsTable, char free, char blocked)
        {
            int width  = directionsTable.GetLength(0);
            int height = directionsTable.GetLength(1);

            int expandedWidth  = ExpandSize(width);
            int expandedHeight = ExpandSize(height);

            char[,] mazeChars = new char[expandedWidth, expandedHeight];

            // initialize all values to blocked
            for (int ex = 0; ex < expandedWidth; ex++)
            {
                for (int ey = 0; ey < expandedHeight; ey++)
                {
                    mazeChars[ex, ey] = blocked;
                }
            }

            // start freeing up values...
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    Directions_Ortho_2D dir = directionsTable[x, y];

                    int ex = ExpandSize(x);
                    int ey = ExpandSize(y);

                    mazeChars[ex, ey] = free;
                    if (dir.HasFlag(Directions_Ortho_2D.U))
                    {
                        mazeChars[ex, ey + 1] = free;
                    }
                    if (dir.HasFlag(Directions_Ortho_2D.D))
                    {
                        mazeChars[ex, ey - 1] = free;
                    }
                    if (dir.HasFlag(Directions_Ortho_2D.L))
                    {
                        mazeChars[ex - 1, ey] = free;
                    }
                    if (dir.HasFlag(Directions_Ortho_2D.R))
                    {
                        mazeChars[ex + 1, ey] = free;
                    }
                }
            }

            return(mazeChars);
        }
Пример #4
0
        public HashSet <Vec2i> Geometric_Neighbors(Directions_Ortho_2D directions)
        {
            HashSet <Vec2i> geometric_neighbors = new HashSet <Vec2i>();

            if (directions.HasFlag(Directions_Ortho_2D.L))
            {
                geometric_neighbors.Add(To_Left());
            }
            if (directions.HasFlag(Directions_Ortho_2D.R))
            {
                geometric_neighbors.Add(To_Right());
            }
            if (directions.HasFlag(Directions_Ortho_2D.U))
            {
                geometric_neighbors.Add(To_Up());
            }
            if (directions.HasFlag(Directions_Ortho_2D.D))
            {
                geometric_neighbors.Add(To_Down());
            }
            return(geometric_neighbors);
        }
        public static double Cells__Symmetry_X_Axis(this PM_Maze maze, Vec2i cell1, Vec2i cell2)
        {
            double sum = 0;
            Directions_Ortho_2D dir1 = maze.Q_Cell_Directions(cell1);
            Directions_Ortho_2D dir2 = maze.Q_Cell_Directions(cell2);

            // left
            if (dir1.HasFlag(Directions_Ortho_2D.L) && dir2.HasFlag(Directions_Ortho_2D.L))
            {
                sum++;
            }
            else if (dir1.HasFlag(Directions_Ortho_2D.L) == false && dir2.HasFlag(Directions_Ortho_2D.L) == false)
            {
                sum++;
            }

            // right
            if (dir1.HasFlag(Directions_Ortho_2D.R) && dir2.HasFlag(Directions_Ortho_2D.R))
            {
                sum++;
            }
            else if (dir1.HasFlag(Directions_Ortho_2D.R) == false && dir2.HasFlag(Directions_Ortho_2D.R) == false)
            {
                sum++;
            }

            // up vs down
            if (dir1.HasFlag(Directions_Ortho_2D.U) && dir2.HasFlag(Directions_Ortho_2D.D))
            {
                sum++;
            }
            else if (dir1.HasFlag(Directions_Ortho_2D.U) == false && dir2.HasFlag(Directions_Ortho_2D.D) == false)
            {
                sum++;
            }

            // down vs up
            if (dir1.HasFlag(Directions_Ortho_2D.D) && dir2.HasFlag(Directions_Ortho_2D.U))
            {
                sum++;
            }
            else if (dir1.HasFlag(Directions_Ortho_2D.D) == false && dir2.HasFlag(Directions_Ortho_2D.U) == false)
            {
                sum++;
            }

            return(sum / 4.0);
        }
Пример #6
0
        public static List <Directions_Ortho_2D> AsList(
            this Directions_Ortho_2D directions
            )
        {
            List <Directions_Ortho_2D> directionsList = new List <Directions_Ortho_2D>();

            if (directions.HasFlag(Directions_Ortho_2D.U))
            {
                directionsList.Add(Directions_Ortho_2D.U);
            }
            if (directions.HasFlag(Directions_Ortho_2D.D))
            {
                directionsList.Add(Directions_Ortho_2D.D);
            }
            if (directions.HasFlag(Directions_Ortho_2D.L))
            {
                directionsList.Add(Directions_Ortho_2D.L);
            }
            if (directions.HasFlag(Directions_Ortho_2D.R))
            {
                directionsList.Add(Directions_Ortho_2D.R);
            }
            return(directionsList);
        }
Пример #7
0
        private static double Directions_Similarity_Score(Directions_Ortho_2D dir1, Directions_Ortho_2D dir2)
        {
            double score = 0;

            if (
                (dir1.HasFlag(Directions_Ortho_2D.U) && dir2.HasFlag(Directions_Ortho_2D.U))
                ||
                (dir1.HasFlag(Directions_Ortho_2D.U) == false && dir2.HasFlag(Directions_Ortho_2D.U) == false)
                )
            {
                score++;
            }
            if (
                (dir1.HasFlag(Directions_Ortho_2D.D) && dir2.HasFlag(Directions_Ortho_2D.D))
                ||
                (dir1.HasFlag(Directions_Ortho_2D.D) == false && dir2.HasFlag(Directions_Ortho_2D.D) == false)
                )
            {
                score++;
            }
            if (
                (dir1.HasFlag(Directions_Ortho_2D.L) && dir2.HasFlag(Directions_Ortho_2D.L))
                ||
                (dir1.HasFlag(Directions_Ortho_2D.L) == false && dir2.HasFlag(Directions_Ortho_2D.L) == false)
                )
            {
                score++;
            }
            if (
                (dir1.HasFlag(Directions_Ortho_2D.R) && dir2.HasFlag(Directions_Ortho_2D.R))
                ||
                (dir1.HasFlag(Directions_Ortho_2D.R) == false && dir2.HasFlag(Directions_Ortho_2D.R) == false)
                )
            {
                score++;
            }
            return(score / 4.0);
        }