public GridVector SortCorners() { // var minX = corners[0].x; var maxX = corners[0].x; var minY = corners[0].y; var maxY = corners[0].y; foreach (var corner in corners) { if (corner.x < minX) minX = corner.x; if (corner.x > maxX) maxX = corner.x; if (corner.y < minY) minY = corner.y; if (corner.y > maxY) maxY = corner.y; } // var oldC = new List<GridVector>(corners); var newC = new List<GridVector>(); bool parallelX = false; while (oldC.Count > 1) { // if (newC.Count == 0) { if (ScanUp(ref oldC, ref newC, minX, minY, maxY)) continue; if (ScanRight(ref oldC, ref newC, minX, minY, maxX)) continue; if (ScanDown(ref oldC, ref newC, minX, minY, minY)) continue; if (!ScanLeft(ref oldC, ref newC, minX, minY, minX)) { Debug.Log("Error on start"); return null; } } // else { var last = newC[newC.Count - 1]; if (parallelX) { if (ScanRight(ref oldC, ref newC, last.x, last.y, maxX)) { parallelX = false; continue; } if (ScanLeft(ref oldC, ref newC, last.x, last.y, minX)) { parallelX = false; continue; } } else { if (ScanUp(ref oldC, ref newC, last.x, last.y, maxY)) { parallelX = true; continue; } if (ScanDown(ref oldC, ref newC, last.x, last.y, minY)) { parallelX = true; continue; } } Debug.Log("Error -------------------------------------------------"); Debug.Log("Corners: " + corners.Count); Debug.Log("OldC: " + oldC.Count); Debug.Log("NewC: " + newC.Count); Debug.Log(last); color = Color.red; return last; } } // newC.Add(oldC[0]); corners = newC; return null; } bool ScanLeft(ref List<GridVector> oldC, ref List<GridVector> newC, int startX, int startY, int minX) { for (var x = startX; x >= minX; x--) { var index = oldC.FindIndex(gv => gv.x == x && gv.y == startY); if (index > -1) { newC.Add(oldC[index]); oldC.RemoveAt(index); return true; } } return false; } bool ScanUp(ref List<GridVector> oldC, ref List<GridVector> newC, int startX, int startY, int maxY) { for (var y = startY; y <= maxY; y++) { var index = oldC.FindIndex(gv => gv.x == startX && gv.y == y); if (index > -1) { newC.Add(oldC[index]); oldC.RemoveAt(index); return true; } } return false; } bool ScanRight(ref List<GridVector> oldC, ref List<GridVector> newC, int startX, int startY, int maxX) { for (var x = startX; x <= maxX; x++) { var index = oldC.FindIndex(gv => gv.x == x && gv.y == startY); if (index > -1) { newC.Add(oldC[index]); oldC.RemoveAt(index); return true; } } return false; } bool ScanDown(ref List<GridVector> oldC, ref List<GridVector> newC, int startX, int startY, int minY) { for (var y = startY; y >= minY; y--) { var index = oldC.FindIndex(gv => gv.x == startX && gv.y == y); if (index > -1) { newC.Add(oldC[index]); oldC.RemoveAt(index); return true; } } return false; }
List<RoomWall> FindSegments(RoomWall wall, Color freeColor, Color roomColor) { var moved = wall + wall.outwards.minimized; BresenhamLine(moved, new Color(Random.value * 0.7f + 0.1f, Random.value * 0.7f + 0.1f, Random.value * 0.7f + 0.1f), segmentsTexture); var x0 = moved.start.x; var y0 = moved.start.y; var x1 = moved.end.x; var y1 = moved.end.y; var segments = new List<RoomWall>(); GridVector start = null; GridVector end = null; bool steep = Math.Abs(y1 - y0) > Math.Abs(x1 - x0); if (steep) { Swap(ref x0, ref y0); Swap(ref x1, ref y1); } if (x0 > x1) { Swap(ref x0, ref x1); Swap(ref y0, ref y1); } for (int x = x0; x <= x1; x++) { for (int y = y0; y <= y1; y++) { int coordX = steep ? y : x; int coordY = steep ? x : y; Color color = texture.GetPixel(coordX, coordY); if (color != freeColor && color != roomColor) { if (end != null && start != null) { var segment = new RoomWall(start, end); segment -= wall.outwards.minimized; segments.Add(segment); start = null; end = null; } scanTexture.SetPixel(coordX, coordY, Color.red); } else { if (start == null) { start = new GridVector(coordX, coordY); } end = new GridVector(coordX, coordY); scanTexture.SetPixel(coordX, coordY, Color.green); } } } if (end != null && start != null) { var segment = new RoomWall(start, end); segment -= wall.outwards.minimized; segments.Add(segment); } return segments; }
Source: https://habr.com/ru/post/184818/
All Articles