public List <C2DHoledPolygon> GetIntersectingPolygons(IList <C2DPoint> pointsA, IList <C2DPoint> pointsB, IntersectionType whichPolygons) { var leftPoly = new C2DPolygon(pointsA.ToList(), true); var rightPoly = new C2DPolygon(pointsB.ToList(), true); rightPoly.RandomPerturb(); var someGrid = new CGrid(); var smallPolygons = new List <C2DHoledPolygon>(); switch (whichPolygons) { case IntersectionType.Overlapping: leftPoly.GetOverlaps(rightPoly, smallPolygons, someGrid); break; case IntersectionType.NonOverlapping: leftPoly.GetNonOverlaps(rightPoly, smallPolygons, someGrid); break; default: throw new ArgumentException(nameof(whichPolygons)); } return(smallPolygons); }
private static double CalculateConstraintCost() { double asd = 0.0; List <_Point> boundaries2 = localModel.OutlinePolygonPoints; if (boundaries2 == null || (boundaries2 != null && !boundaries2.Any())) { return(asd); } List <C2DPoint> convertedPointsForPolygon3 = boundaries2.Select(i => new C2DPoint(i.X, i.Y)).ToList(); C2DPolygon BoundaryPolygon = new C2DPolygon(); BoundaryPolygon.Create(convertedPointsForPolygon3, true); foreach (_Room room in localModel.rooms) { List <_Point> boundaries = room.GetPoints(); if (!boundaries.Any()) { continue; } List <C2DPoint> convertedPointsForPolygon2 = boundaries.Select(i => new C2DPoint(i.X, i.Y)).ToList(); C2DPolygon roomPolygon = new C2DPolygon(); roomPolygon.Create(convertedPointsForPolygon2, true); room.Polygon = roomPolygon; CGrid grid = new CGrid(); List <C2DHoledPolygon> asdasd = new List <C2DHoledPolygon>(); roomPolygon.GetOverlaps(BoundaryPolygon, asdasd, grid); List <double> a = asdasd.Select(i => i.GetArea()).ToList(); double sumoverlap = a.Sum() / 10000; double actualArea = room.Area; if (actualArea - sumoverlap > 0) { asd += +10000000; } asd += Math.Pow(2, actualArea - sumoverlap); } for (var i = 0; i < localModel.rooms.Count; i++) { _Room modelRoom = localModel.rooms[i]; for (int j = i + 1; j < localModel.rooms.Count; j++) { _Room modelRoom2 = localModel.rooms[j]; CGrid grid = new CGrid(); List <C2DHoledPolygon> asdasd = new List <C2DHoledPolygon>(); modelRoom.Polygon.GetOverlaps(modelRoom2.Polygon, asdasd, grid); List <double> a = asdasd.Select(k => k.GetArea()).ToList(); double sumoverlap = a.Sum() / 10000; double actualArea = modelRoom.Area; if (sumoverlap > 0) { asd += +10000000; } } } //then avoid room overlaps return(asd); }