namespace CutList.Core.Nesting.Pipeline
{
///
/// Implements the First-Fit Decreasing (FFD) bin packing algorithm.
/// Assumes items are already sorted by length descending.
/// Places each item in the first bin that has enough space.
///
public class FirstFitDecreasingStep : IPackingStep
{
public void Execute(PackingContext context)
{
while (context.RemainingItems.Count > 0 && context.CanAddMoreBins())
{
var bin = context.CreateBin();
FillBin(bin, context.RemainingItems);
context.Bins.Add(bin);
}
}
private static void FillBin(Bin bin, List remainingItems)
{
for (int i = 0; i < remainingItems.Count; i++)
{
var item = remainingItems[i];
if (bin.RemainingLength >= item.Length)
{
bin.AddItem(item);
remainingItems.RemoveAt(i);
i--;
}
}
}
}
}