public InnerMap GenerateMapPart(int xStart, int yStart, int widthPart, int heightPart) { InnerMap map = new BitArreintjeFastInnerMap(widthPart, heightPart); //If the maze is out of screen var theRightEdge = Math.Max(((xStart + widthPart) - width), 0); var theBottomEdge = Math.Max(((yStart + heightPart) - height), 0); map.FillMap(true); //Add walls if (xStart == 0) { for (int y = 0; y < heightPart - theBottomEdge; y++) { map[0, y] = false; } } if (yStart == 0) { for (int x = 0; x < widthPart - theRightEdge; x++) { map[x, 0] = false; } } if (xStart + widthPart >= width) { for (int y = 0; y < heightPart - theBottomEdge; y++) { map[widthPart - 1 - theRightEdge, y] = false; } if (UnevenHelper.NumberIsEven(width)) { for (int y = 0; y < heightPart - theBottomEdge; y++) { map[widthPart - 2 - theRightEdge, y] = false; } } } if (yStart + heightPart >= height) { for (int x = 0; x < widthPart - theRightEdge; x++) { map[x, heightPart - 1 - theBottomEdge] = false; } if (UnevenHelper.NumberIsEven(height)) { for (int x = 0; x < widthPart - theRightEdge; x++) { map[x, heightPart - 2 - theBottomEdge] = false; } } } var visibleRectangle = new Rectangle(xStart, yStart, widthPart, heightPart, 0); var rectangles = new Stack <Rectangle>(); var random = new NetRandom(seed); var startRect = new Rectangle(0, 0, UnevenHelper.MakeUneven(width), UnevenHelper.MakeUneven(height), random.Next()); rectangles.Push(startRect); while (rectangles.Count > 0) { var curRect = rectangles.Pop(); //Console.WriteLine($"X: {curRect.X} Y: {curRect.Y} Width: {curRect.Width} Height: {curRect.Height}"); random.Reinitialise(curRect.Seed); bool horizontalSplit = true; //form.drawRectangle(curRect.X, curRect.Y, curRect.Width, curRect.Height, Brushes.Pink); if (curRect.Width > curRect.Height) { horizontalSplit = false; } else if (curRect.Width < curRect.Height) { horizontalSplit = true; } else { if (random.Next(2) == 0) { horizontalSplit = false; } } if (horizontalSplit) { int splitnumber = 2 + random.Next((curRect.Height - 2) / 2) * 2; int opening = 1 + random.Next((curRect.Width) / 2) * 2 + curRect.X; Rectangle rect1 = new Rectangle(curRect.X, curRect.Y, curRect.Width, splitnumber + 1, random.Next()); Rectangle rect2 = new Rectangle(curRect.X, curRect.Y + splitnumber, curRect.Width, curRect.Height - splitnumber, random.Next()); int xStartDraw = Math.Max(0, curRect.X - xStart); int xEndDraw = Math.Min(widthPart, curRect.X - xStart + curRect.Width); int yPos = curRect.Y + splitnumber - yStart; if (yPos >= 0 && yPos < heightPart - 1) { for (int i = xStartDraw; i < xEndDraw; i++) { if (i != opening - xStart) { map[i, yPos] = false; } } } if (IsValidRect(visibleRectangle, rect1)) { rectangles.Push(rect1); } if (IsValidRect(visibleRectangle, rect2)) { rectangles.Push(rect2); } } else { int splitnumber = 2 + random.Next((curRect.Width - 2) / 2) * 2; int opening = 1 + random.Next((curRect.Height) / 2) * 2 + curRect.Y; Rectangle rect1 = new Rectangle(curRect.X, curRect.Y, splitnumber + 1, curRect.Height, random.Next()); Rectangle rect2 = new Rectangle(curRect.X + splitnumber, curRect.Y, curRect.Width - splitnumber, curRect.Height, random.Next()); var yStartDraw = Math.Max(0, curRect.Y - yStart); int yEndDraw = Math.Min(heightPart, curRect.Y - yStart + curRect.Height); int xPos = curRect.X + splitnumber - xStart; if (xPos >= 0 && xPos < widthPart - 1) { for (int i = yStartDraw; i < yEndDraw; i++) { if (i != opening - yStart) { map[xPos, i] = false; } } } if (IsValidRect(visibleRectangle, rect1)) { rectangles.Push(rect1); } if (IsValidRect(visibleRectangle, rect2)) { rectangles.Push(rect2); } } } return(map); }
public static void Test2() { var netRandom = new NetRandom(1337); var a0 = netRandom.Next(); var b0 = netRandom.Next(); netRandom.Reinitialise(100); var a1 = netRandom.Next(); var b1 = netRandom.Next(); var netRandomNew = new NetRandom(100); var a2 = netRandomNew.Next(); var b2 = netRandomNew.Next(); int totSize = 128; Console.WriteLine($"Tot size: {totSize}"); var alg = new AlgorithmDivisionDynamicOldTestingThing(totSize, totSize, 1337); for (int y = 0; y < 8; y++) { var ww = Stopwatch.StartNew(); for (int i = 0; i < 100; i++) { var a = alg.GenerateMapPart(0, 0, 256, 256); } Console.WriteLine(ww.Elapsed); } //var partTot = alg.GenerateMapPart(0, 0, totSize, totSize); //SaveMaze("parttot.png", partTot); int b = 256; var dir = Directory.CreateDirectory("Images"); var w = new Stopwatch(); var dinges = totSize / b; if (totSize % b != 0) { dinges += 1; } for (int y = 0; y < dinges; y++) { for (int x = 0; x < dinges; x++) { w.Restart(); var part = alg.GenerateMapPart(x * b, y * b, b, b); w.Stop(); WithoutPath.SaveMaze(Path.Combine("Images", $"{x}_{y}.png"), part); Console.WriteLine($"{x}_{y}.png : {w.Elapsed}"); } } var part1 = alg.GenerateMapPart(0, 0, b, b); //var part2 = alg.GenerateMapPart(b, 0, b, b); //var part3 = alg.GenerateMapPart(0, b, b, b); //var part4 = alg.GenerateMapPart(b, b, b, b); WithoutPath.SaveMaze("part1.png", part1); //SaveMaze("part2.png", part2); //SaveMaze("part3.png", part3); //SaveMaze("part4.png", part4); }