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); }
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); }
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); }
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); }
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); }