protected override void GenerateNewExtremePointsForNewItem(PackingItem newItem, PackingPosition position)
        {
            int newWidth  = position.Rotated ? newItem.Height : newItem.Width;
            int newHeight = position.Rotated ? newItem.Width : newItem.Height;

            //Find ExtremePoints beginning from sourcepointX
            var sourcePointX = new PackingPosition(0, position.X + newWidth, position.Y);

            if (sourcePointX.X < BinShape.Width && sourcePointX.Y < BinShape.Height)
            {
                //Traversing down the y-axis
                var newPoint = new PackingPosition(0, sourcePointX.X, sourcePointX.Y - 1);
                while (sourcePointX.Y > 0 && !IsPointOccupied(newPoint))
                {
                    sourcePointX = newPoint;
                    newPoint     = new PackingPosition(0, sourcePointX.X, sourcePointX.Y - 1);
                }
                ExtremePoints.Add(new PackingPosition(0, sourcePointX.X, sourcePointX.Y));
            }

            //Find ExtremePoints beginning from sourcepointY
            var sourcePointY = new PackingPosition(0, position.X, position.Y + newHeight);

            if (sourcePointY.X < BinShape.Width && sourcePointY.Y < BinShape.Height)
            {
                //Traversing down the x-axis
                var newPoint = new PackingPosition(0, sourcePointY.X - 1, sourcePointY.Y);
                while (sourcePointY.X > 0 && !IsPointOccupied(newPoint))
                {
                    sourcePointY = newPoint;
                    newPoint     = new PackingPosition(0, sourcePointY.X - 1, sourcePointY.Y);
                }
                ExtremePoints.Add(new PackingPosition(0, sourcePointY.X, sourcePointY.Y));
            }
        }
        public override PackingPosition FindExtremePointForItem(PackingItem item, bool rotated, bool stackingConstraints)
        {
            PackingItem newItem = new PackingItem(
                rotated ? item.Depth : item.Width,
                item.Height,
                rotated ? item.Width : item.Depth,
                item.TargetBin);

            int epIndex = 0;

            while (epIndex < ExtremePoints.Count && (
                       !IsPositionFeasible(newItem, ExtremePoints.ElementAt(epIndex)) ||
                       !IsSupportedByAtLeastOnePoint(newItem, ExtremePoints.ElementAt(epIndex)) ||
                       (stackingConstraints && !IsStaticStable(newItem, ExtremePoints.ElementAt(epIndex))) ||
                       (stackingConstraints && !IsWeightSupported(newItem, ExtremePoints.ElementAt(epIndex)))
                       ))
            {
                epIndex++;
            }

            if (epIndex < ExtremePoints.Count)
            {
                var origPoint = ExtremePoints.ElementAt(epIndex);
                var result    = new PackingPosition(origPoint.AssignedBin, origPoint.X, origPoint.Y, origPoint.Z, rotated);
                return(result);
            }
            return(null);
        }
 private void AddExtremePoint(PackingPosition current)
 {
     if (ExtremePoints.Add(current))
     {
         var tuple = Tuple.Create(BinShape.Width - current.X, BinShape.Height - current.Y, BinShape.Depth - current.Z);
         ResidualSpace.Add(current, tuple);
     }
 }
Example #4
0
        public void PackItem(int itemID, TItem item, TPos position)
        {
            Items[itemID]     = item;
            Positions[itemID] = position;
            ExtremePoints.Remove(position);
            foreach (int id in Items.Select(x => x.Key))
            {
                GenerateNewExtremePointsForNewItem(Items[id], Positions[id]);
            }

            AddNewItemToOccupationLayers(itemID, item, position);
        }
        public override void PackItem(int itemID, PackingItem item, PackingPosition position)
        {
            // base call is deliberately omitted, because UpdateResidualSpace needs to be fitted in before
            Items[itemID]     = item;
            Positions[itemID] = position;
            ExtremePoints.Remove(position);
            ResidualSpace.Remove(position);
            UpdateResidualSpace(item, position);
            foreach (int id in Items.Select(x => x.Key))
            {
                GenerateNewExtremePointsForNewItem(Items[id], Positions[id]);
            }

            AddNewItemToOccupationLayers(itemID, item, position);
        }
        public override PackingPosition FindExtremePointForItem(PackingItem item, bool rotated, bool stackingConstraints)
        {
            PackingItem newItem = new PackingItem(
                rotated ? item.Depth : item.Width,
                item.Height,
                rotated ? item.Width : item.Depth,
                item.TargetBin, item.Weight, item.Material);

            var ep = ExtremePoints.Where(x => IsPositionFeasible(newItem, x, stackingConstraints)).FirstOrDefault();

            if (ep != null)
            {
                var result = new PackingPosition(ep.AssignedBin, ep.X, ep.Y, ep.Z, rotated);
                return(result);
            }
            return(null);
        }
        public override PackingPosition FindExtremePointForItem(PackingItem item, bool rotated, bool stackingConstraints)
        {
            PackingItem rotatedItem = new PackingItem(
                rotated ? item.Height : item.Width,
                rotated ? item.Width : item.Height,
                item.TargetBin);

            int epIndex = 0;

            while (epIndex < ExtremePoints.Count && (!IsPositionFeasible(rotatedItem, ExtremePoints.ElementAt(epIndex))))
            {
                epIndex++;
            }

            if (epIndex < ExtremePoints.Count)
            {
                var currentPoint = ExtremePoints.ElementAt(epIndex);

                var result = new PackingPosition(currentPoint.AssignedBin, currentPoint.X, currentPoint.Y, rotated);
                return(result);
            }
            return(null);
        }
Example #8
0
 public void ExtremePointsNormalTestCase100Points()
 {
     convexHullTester = new ExtremePoints();
     Case100Points();
 }
Example #9
0
 public void ExtremePointsTestCase9()
 {
     convexHullTester = new ExtremePoints();
     Case9();
 }
Example #10
0
 public void ExtremePointsSpecialCaseConvexPolygon()
 {
     convexHullTester = new ExtremePoints();
     SpecialCaseConvexPolygon();
 }
Example #11
0
 public void ExtremePointsSpecialCaseTriangle()
 {
     convexHullTester = new ExtremePoints();
     SpecialCaseTriangle();
 }
 public void ExtremePointsSpecialCase10SamePoints()
 {
     convexHullTester = new ExtremePoints();
     SpecialCase10SamePoints();
 }
Example #13
0
 public BinPacking2D(PackingShape binShape)
     : base(binShape)
 {
     ExtremePoints.Add(binShape.Origin);
     InitializeOccupationLayers();
 }
        protected override void GenerateNewExtremePointsForNewItem(PackingItem newItem, PackingPosition position)
        {
            int newWidth = position.Rotated ? newItem.Depth : newItem.Width;
            int newDepth = position.Rotated ? newItem.Width : newItem.Depth;

            //Find ExtremePoints beginning from sourcepointX
            var sourcePointX = new PackingPosition(0, position.X + newWidth, position.Y, position.Z);

            if (sourcePointX.X < BinShape.Width && sourcePointX.Y < BinShape.Height && sourcePointX.Z < BinShape.Depth)
            {
                //Traversing down the y-axis
                PackingPosition current = new PackingPosition(0, sourcePointX.X, sourcePointX.Y, sourcePointX.Z);
                while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current)))
                {
                    current = PackingPosition.MoveDown(current);
                }
                ExtremePoints.Add((PackingPosition)current.Clone());
                while (current.X > 0 && !IsPointOccupied(PackingPosition.MoveLeft(current)))
                {
                    current = PackingPosition.MoveLeft(current);
                }
                ExtremePoints.Add(current);

                //Traversing down the z-axis
                current = new PackingPosition(0, sourcePointX.X, sourcePointX.Y, sourcePointX.Z);
                while (current.Z > 0 && !IsPointOccupied(PackingPosition.MoveBack(current)))
                {
                    current = PackingPosition.MoveBack(current);
                }
                ExtremePoints.Add((PackingPosition)current.Clone());
                while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current)))
                {
                    current = PackingPosition.MoveDown(current);
                }
                ExtremePoints.Add(current);
            }

            //Find ExtremePoints beginning from sourcepointY
            var sourcePointY = new PackingPosition(0, position.X, position.Y + newItem.Height, position.Z);

            if (sourcePointY.X < BinShape.Width && sourcePointY.Y < BinShape.Height && sourcePointY.Z < BinShape.Depth)
            {
                //Traversing down the x-axis
                PackingPosition current = new PackingPosition(0, sourcePointY.X, sourcePointY.Y, sourcePointY.Z);
                while (current.X > 0 && !IsPointOccupied(PackingPosition.MoveLeft(current)))
                {
                    current = PackingPosition.MoveLeft(current);
                }
                ExtremePoints.Add((PackingPosition)current.Clone());
                while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current)))
                {
                    current = PackingPosition.MoveDown(current);
                }
                ExtremePoints.Add(current);

                //Traversing down the z-axis
                current = new PackingPosition(0, sourcePointY.X, sourcePointY.Y, sourcePointY.Z);
                while (current.Z > 0 && !IsPointOccupied(PackingPosition.MoveBack(current)))
                {
                    current = PackingPosition.MoveBack(current);
                }
                ExtremePoints.Add((PackingPosition)current.Clone());
                while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current)))
                {
                    current = PackingPosition.MoveDown(current);
                }
                ExtremePoints.Add(current);
            }

            //Find ExtremePoints beginning from sourcepointZ
            var sourcePointZ = new PackingPosition(0, position.X, position.Y, position.Z + newDepth);

            if (sourcePointZ.X < BinShape.Width && sourcePointZ.Y < BinShape.Height && sourcePointZ.Z < BinShape.Depth)
            {
                //Traversing down the x-axis
                PackingPosition current = new PackingPosition(0, sourcePointZ.X, sourcePointZ.Y, sourcePointZ.Z);
                while (current.X > 0 && !IsPointOccupied(PackingPosition.MoveLeft(current)))
                {
                    current = PackingPosition.MoveLeft(current);
                }
                ExtremePoints.Add((PackingPosition)current.Clone());
                while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current)))
                {
                    current = PackingPosition.MoveDown(current);
                }
                ExtremePoints.Add(current);

                //Traversing down the y-axis
                current = new PackingPosition(0, sourcePointZ.X, sourcePointZ.Y, sourcePointZ.Z);
                while (current.Y > 0 && !IsPointOccupied(PackingPosition.MoveDown(current)))
                {
                    current = PackingPosition.MoveDown(current);
                }
                ExtremePoints.Add((PackingPosition)current.Clone());
                while (current.X > 0 && !IsPointOccupied(PackingPosition.MoveLeft(current)))
                {
                    current = PackingPosition.MoveLeft(current);
                }
                ExtremePoints.Add(current);
            }
        }