/// <summary> /// Gets the intersection of a plane at the specified height as a list of contours (i.e a list of 2D polygons). /// </summary> /// <param name="elevation">The elevation.</param> /// <returns>List<BarrierPolygons>.</returns> public List <BarrierPolygon> GetIntersection(double elevation) { var edges = new List <UVLine>(); foreach (var item in this._faces) { if (item.Intersects(elevation)) { var edge = item.GetIntersection(elevation); UV p1 = new UV(edge.Start.X, edge.Start.Y); UV p2 = new UV(edge.End.X, edge.End.Y); edges.Add(new UVLine(p1, p2)); } } var plines = PLine.ExtractPLines(edges); List <BarrierPolygon> boundary = new List <BarrierPolygon>(); foreach (PLine item in plines) { var oneBoundary = item.Simplify(0.001d, 0.0001d); if (oneBoundary != null) { var polygon = new BarrierPolygon(oneBoundary.ToArray()) { IsClosed = item.Closed }; boundary.Add(polygon); } } return(boundary); }
/// <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> /// Gets the boundary polygons of a collection of cells. /// </summary> /// <param name="cellIDs">The visible cells.</param> /// <param name="cellularFloor">The cellular floor.</param> /// <returns>List<BarrierPolygons>.</returns> public static List <BarrierPolygon> GetBoundary(ICollection <int> cellIDs, CellularFloorBaseGeometry cellularFloor) { Dictionary <UVLine, int> guid = new Dictionary <UVLine, int>(); foreach (var item in cellIDs) { var lines = cellularFloor.CellToLines(cellularFloor.FindCell(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); }