Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }