示例#1
0
        /// <summary>
        /// Help method for checking if placed object overlaps.
        /// </summary>
        public bool DoesPlacedObjectsOverlap()
        {
            foreach (var container in containers)
            {
                foreach (var object1 in container.PlacedObjects)
                {
                    foreach (var object2 in container.PlacedObjects)
                    {
                        if (object1 != object2)
                        {
                            PlacedObject2D placedObject1 = object1 as PlacedObject2D;
                            PlacedObject2D placedObject2 = object2 as PlacedObject2D;

                            if (placedObject1.Position.X < placedObject2.Position.X + placedObject2.Width &&
                                placedObject1.Position.X + placedObject1.Width > placedObject2.Position.X &&
                                placedObject1.Position.Y > placedObject2.Position.Y + placedObject2.Height &&
                                placedObject1.Position.Y + placedObject1.Height < placedObject2.Position.Y)
                            {
                                return(true);
                            }
                        }
                    }
                }
            }

            return(false);
        }
示例#2
0
        public IPlacedObject PlaceObject(Object2D objectToPlace, Position2D position)
        {
            PlacedObject2D newObject = new PlacedObject2D(position, objectToPlace.Width, objectToPlace.Height);

            PlacedObjects.Add(newObject);

            return(newObject);
        }
示例#3
0
        public void MakeSkylineUnavailable(PlacedObject2D theObject)
        {
            foreach (var availableSkyline in AvailableSkylines.ToList())
            {
                if (availableSkyline.Y <= theObject.Y)
                {
                    // Object partially cover skyline below - resize it (left)
                    if (availableSkyline.X < theObject.X &&
                        availableSkyline.X2 <= theObject.X2 &&
                        availableSkyline.X2 > theObject.X)
                    {
                        availableSkyline.Resize(theObject.X2 - availableSkyline.X2);
                        continue;
                    }
                    // Object completely cover skyline below - remove it
                    if (availableSkyline.X >= theObject.X &&
                        availableSkyline.X2 <= theObject.X2)
                    {
                        AvailableSkylines.Remove(availableSkyline);
                        continue;
                    }
                    // Object partially cover skyline below - resize it (right), and move beginning to right
                    if (availableSkyline.X >= theObject.X &&
                        availableSkyline.X < theObject.X2 &&
                        availableSkyline.X2 > theObject.X2)
                    {
                        availableSkyline.Resize(availableSkyline.X2 - theObject.X2);
                        availableSkyline.Move(theObject.X2);
                        continue;
                    }
                    // Object partially cover skyline below from both size -> resize left, resize and move right
                    if (availableSkyline.X < theObject.X &&
                        availableSkyline.X2 > theObject.X2)
                    {
                        var leftSkyline = new Line(availableSkyline.X, theObject.X - availableSkyline.X, availableSkyline.Y);
                        AvailableSkylines.Add(leftSkyline);

                        var rightSkyline = availableSkyline;
                        rightSkyline.Resize(rightSkyline.X2 - theObject.X2);
                        rightSkyline.Move(theObject.X2);
                    }
                }
            }
        }
示例#4
0
 public override void SplitSubcontainer(GuillotineCutSubcontainer2D subcontainer, PlacedObject2D placedObject)
 {
     if (subcontainer.Height > subcontainer.Width)
     {
         SplitSubcontainerVertically(subcontainer, placedObject);
     }
     else
     {
         SplitSubcontainerHorizontally(subcontainer, placedObject);
     }
 }
示例#5
0
        public virtual void PlaceObject(Object2D theObject, Position2D position)
        {
            var placedObject = new PlacedObject2D(position, theObject);

            PlacedObjects.Add(placedObject);
        }
示例#6
0
        private void CreateSkylineAtopObject(PlacedObject2D lastPlacedObject)
        {
            var newSkyline = new Line(lastPlacedObject.X, lastPlacedObject.Width, lastPlacedObject.Y2);

            AvailableSkylines.Add(newSkyline);
        }
        protected void SplitSubcontainerHorizontally(GuillotineCutSubcontainer2D subcontainer, PlacedObject2D placedObject)
        {
            var topSubcontainerPosition = new Position2D(subcontainer.X, placedObject.Y2);
            var topSubcontainerSize     = new Rectangle(subcontainer.Width, subcontainer.Height - placedObject.Height);
            var topSubcontainer         = new GuillotineCutSubcontainer2D(topSubcontainerPosition, topSubcontainerSize.Width, topSubcontainerSize.Height);

            var rightSubcontainerPosition = new Position2D(placedObject.X2, subcontainer.Y);
            var rightSubcontainerSize     = new Rectangle(subcontainer.Width - placedObject.Width, placedObject.Height);
            var rightSubcontainer         = new GuillotineCutSubcontainer2D(rightSubcontainerPosition, rightSubcontainerSize.Width, rightSubcontainerSize.Height);

            // No need to add one dimensional container
            if (topSubcontainer.Width != 0 && topSubcontainer.Height != 0)
            {
                Subcontainers.Add(topSubcontainer);
            }

            if (rightSubcontainer.Width != 0 && rightSubcontainer.Height != 0)
            {
                Subcontainers.Add(rightSubcontainer);
            }

            Subcontainers.Remove(subcontainer);
        }
 public abstract void SplitSubcontainer(GuillotineCutSubcontainer2D subcontainer, PlacedObject2D placedObject);
        public override void SplitSubcontainer(GuillotineCutSubcontainer2D subcontainer, PlacedObject2D placedObject)
        {
            var leftoverHeight = subcontainer.Height - placedObject.Height;
            var leftoverWidth  = subcontainer.Width - placedObject.Width;

            if (leftoverHeight > leftoverWidth)
            {
                SplitSubcontainerVertically(subcontainer, placedObject);
            }
            else
            {
                SplitSubcontainerHorizontally(subcontainer, placedObject);
            }
        }
        public override void SplitSubcontainer(GuillotineCutSubcontainer2D subcontainer, PlacedObject2D placedObject)
        {
            var availableAreaAboveObject        = (subcontainer.Height - placedObject.Height) * placedObject.Width;
            var availableAreaOnTheRightOfObject = placedObject.Height * (subcontainer.Width - placedObject.Width);

            if (availableAreaAboveObject > availableAreaOnTheRightOfObject)
            {
                SplitSubcontainerVertically(subcontainer, placedObject);
            }
            else
            {
                SplitSubcontainerHorizontally(subcontainer, placedObject);
            }
        }