コード例 #1
0
        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));
            }
        }
コード例 #2
0
 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);
     }
 }
コード例 #3
0
 public BinPacking2D(PackingShape binShape)
     : base(binShape)
 {
     ExtremePoints.Add(binShape.Origin);
     InitializeOccupationLayers();
 }
コード例 #4
0
        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);
            }
        }