/// <summary> /// Gets the field boundary polygons. /// </summary> /// <param name="cellularFloor">The cellular floor.</param> /// <returns>List<BarrierPolygons>.</returns> public static List <BarrierPolygon> GetFieldBoundary(CellularFloor cellularFloor) { Dictionary <UVLine, int> guid = new Dictionary <UVLine, int>(); foreach (var item in cellularFloor.Cells) { if (item.FieldOverlapState == OverlapState.Inside) { var lines = cellularFloor.CellToLines(item); foreach (var line in lines) { if (guid.ContainsKey(line)) { guid[line]++; } else { guid.Add(line, 1); } } } } List <UVLine> boundaryLines = new List <UVLine>(); foreach (KeyValuePair <UVLine, int> item in guid) { if (item.Value == 1) { boundaryLines.Add(item.Key); } } guid.Clear(); guid = null; var pLines = PLine.ExtractPLines(boundaryLines); List <BarrierPolygon> boundary = new List <BarrierPolygon>(); foreach (PLine item in pLines) { var oneBoundary = item.Simplify(cellularFloor.CellSize / 10); if (oneBoundary != null) { boundary.Add(new BarrierPolygon(oneBoundary.ToArray())); } } boundaryLines.Clear(); boundaryLines = null; return(boundary); }
/// <summary> /// Expands a collection of indices in the walkable field. /// </summary> /// <param name="cellularFloor">The cellular floor.</param> /// <param name="indices">The indices.</param> /// <returns>HashSet<Index>.</returns> public static HashSet <Index> ExpandInWalkableField(CellularFloor cellularFloor, ICollection <Index> indices) { HashSet <Index> collection = new HashSet <Index>(); foreach (var item in indices) { collection.Add(item); foreach (var relativeIndex in Index.Neighbors) { Index index = item + relativeIndex; if (cellularFloor.ContainsCell(index) && !collection.Contains(index)) { if (cellularFloor.Cells[index.I, index.J].FieldOverlapState == OverlapState.Inside) { collection.Add(index); } } } } return(collection); }