public static TileSelection SelectContiguous(Tile start, TileSelection tiles) { var time = Time.realtimeSinceStartup; TileSelection result = new TileSelection(); TileSelection open = new TileSelection(); open.Add(start); var i = 0; while (open.Count() > 0) { i++; if (i > tiles.Count()) { throw(new Exception("Fill fail")); } var t = open[0]; open.Remove(t); result.Add(t); foreach (var n in t.adjacent.tiles) { if (result.DoesNotContain(n) && tiles.Contains(n)) { open.Add(n); } } } _gui_manager.selected_tiles = result; return(result); }
public static Region ClosestRegion(TileSelection tiles, Region to_ignore = null, HashSet <Region> whitelist = null) { var open = new List <SearchRecord>(); var openTiles = new TileSelection(); var closed = new TileSelection(); foreach (var t in tiles.tiles) { var record = new SearchRecord(); record.t = t; record.cost = 0; open.Add(record); } var i = 0; while (open.Count > 0) { i++; if (i > 1000) { throw(new Exception("Finding closest Region took too long")); } open.Sort((a, b) => a.cost - b.cost); var node = open[0]; closed.Add(node.t); open.RemoveAt(0); openTiles.Remove(node.t); if (node.t.region != null && node.t.region != to_ignore) { if (whitelist == null || whitelist.Contains(node.t.region)) { return(node.t.region); } } foreach (var n in node.t.adjacent.tiles) { if (closed.DoesNotContain(n) && openTiles.DoesNotContain(n)) { var record = new SearchRecord(); record.t = n; record.cost = node.cost + 1; open.Add(record); openTiles.Add(record.t); } } } _gui_manager.selected_region = null; _gui_manager.selected_tiles = tiles; throw new Exception("Could not find any other Regions after " + i + " iterations"); }
public static TileSelection Shrink(TileSelection tiles) { TileSelection result = new TileSelection(); foreach (var t in tiles.tiles) { bool valid = true; foreach (var n in t.adjacent.tiles) { if (tiles.DoesNotContain(n)) { valid = false; break; } } if (valid) { result.Add(t); } } _gui_manager.selected_tiles = result; return(result); }