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);
        }
        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);
        }