void FindLakesAndCoasts() { HashSet <MapPolygon> lake = new HashSet <MapPolygon>(Polygons.Where(_ => _.IsWater)); HashSet <MapPolygon> coast = new HashSet <MapPolygon>(); MapPolygon start = Polygons.First(_ => _.Nodes.Any(__ => __.X == -1 && __.Y == -1)); lake.Remove(start); var q = new Queue <MapPolygon>(); q.Enqueue(start); do { var poly = q.Dequeue(); foreach (var i in poly.Neighbour) { if (i.IsWater && lake.Contains(i)) { if (i.Neighbour.Any(_ => !_.IsWater)) { coast.Add(i); } lake.Remove(i); q.Enqueue(i); } } } while (q.Count > 0); foreach (var i in lake) { i.IsOcean = false; } foreach (var i in coast) { i.IsCoast = true; } }
public void AssignPlacement(SheetPlacement plcpr) { current = plcpr; double totalSheetsArea = 0; double totalPartsArea = 0; PlacedPartsCount = 0; List <NFP> placed = new List <NFP>(); foreach (var item in Polygons) { item.sheet = null; } List <int> sheetsIds = new List <int>(); foreach (var item in plcpr.placements) { foreach (var zitem in item) { var sheetid = zitem.sheetId; if (!sheetsIds.Contains(sheetid)) { sheetsIds.Add(sheetid); } var sheet = Sheets.First(z => z.id == sheetid); totalSheetsArea += Math.Abs(GeometryUtil.polygonArea(sheet)); foreach (var ssitem in zitem.sheetplacements) { PlacedPartsCount++; var poly = Polygons.First(z => z.id == ssitem.id); totalPartsArea += Math.Abs(GeometryUtil.polygonArea(poly)); placed.Add(poly); poly.sheet = sheet; poly.x = ssitem.x + sheet.x; poly.y = ssitem.y + sheet.y; poly.rotation = ssitem.rotation; } } } var emptySheets = Sheets.Where(z => !sheetsIds.Contains(z.id)).ToArray(); UsedSheetsCount = Sheets.Count - emptySheets.Length; MaterialUtilization = Math.Abs(totalPartsArea / totalSheetsArea); var ppps = Polygons.Where(z => !placed.Contains(z)); foreach (var item in ppps) { item.x = -1000; item.y = 0; } }
private void FindLakesAndCoasts() { HashSet <MapPolygon> lake = new HashSet <MapPolygon>(Polygons.Where(_ => _.IsWater)); HashSet <MapPolygon> coast = new HashSet <MapPolygon>(); MapPolygon start = Polygons.First(_ => _.Nodes.Any(__ => __.X == -1 && __.Y == -1)); lake.Remove(start); Queue <MapPolygon> q = new Queue <MapPolygon>(); q.Enqueue(start); do { MapPolygon poly = q.Dequeue(); foreach (MapPolygon i in poly.Neighbour) { if (i.IsWater && lake.Contains(i)) { if (i.Neighbour.Any(_ => !_.IsWater)) { coast.Add(i); } lake.Remove(i); q.Enqueue(i); } } } while (q.Count > 0); foreach (MapPolygon i in lake) { foreach (MapNode j in i.Nodes) { j.RiverValue = 1; } i.IsOcean = false; if (i.Neighbour.Any(_ => !_.IsWater)) { coast.Add(i); } } foreach (MapPolygon i in coast) { i.IsCoast = true; } foreach (MapPolygon i in coast) { foreach (MapPolygon j in i.Neighbour.Where(n => n.IsWater)) { j.IsCoast = true; } } }
/// <summary> /// Convert Clipper polygons to JtLoops /// </summary> JtLoops ConvertToLoops(Polygons union) { JtLoops loops = new JtLoops(union.Count); JtLoop loop = new JtLoop(union.First <Polygon>().Count); foreach (Polygon poly in union) { loop.Clear(); foreach (IntPoint p in poly) { loop.Add(new Point2dInt( (int)p.X, (int)p.Y)); } loops.Add(loop); } return(loops); }