diff --git a/OpenNest.Engine/RectanglePacking/FillBestFit.cs b/OpenNest.Engine/RectanglePacking/FillBestFit.cs index c90e292..8b8d74d 100644 --- a/OpenNest.Engine/RectanglePacking/FillBestFit.cs +++ b/OpenNest.Engine/RectanglePacking/FillBestFit.cs @@ -52,12 +52,12 @@ namespace OpenNest.RectanglePacking item.Location = bin.Location; - bin.Items.AddRange(VPattern(item, normalRows, normalColumns, int.MaxValue)); + bin.Items.AddRange(FillGrid(item, normalRows, normalColumns, int.MaxValue)); item.Location.X += item.Width * normalColumns; item.Rotate(); - bin.Items.AddRange(VPattern(item, rotateRows, rotateColumns, int.MaxValue)); + bin.Items.AddRange(FillGrid(item, rotateRows, rotateColumns, int.MaxValue)); return bin; } @@ -77,12 +77,12 @@ namespace OpenNest.RectanglePacking item.Location = bin.Location; - bin.Items.AddRange(VPattern(item, normalRows, normalColumns, int.MaxValue)); + bin.Items.AddRange(FillGrid(item, normalRows, normalColumns, int.MaxValue)); item.Location.Y += item.Height * normalRows; item.Rotate(); - bin.Items.AddRange(VPattern(item, rotateRows, rotateColumns, int.MaxValue)); + bin.Items.AddRange(FillGrid(item, rotateRows, rotateColumns, int.MaxValue)); return bin; } diff --git a/OpenNest.Engine/RectanglePacking/FillEngine.cs b/OpenNest.Engine/RectanglePacking/FillEngine.cs index 8ed460c..2164351 100644 --- a/OpenNest.Engine/RectanglePacking/FillEngine.cs +++ b/OpenNest.Engine/RectanglePacking/FillEngine.cs @@ -16,61 +16,23 @@ namespace OpenNest.RectanglePacking public abstract void Fill(Item item, int maxCount); - /// - /// Vertical pattern. - /// - /// - /// - /// - /// - protected List VPattern(Item item, int rows, int columns, int maxCount) + protected List FillGrid(Item item, int rows, int columns, int maxCount, bool columnMajor = true) { var items = new List(); - for (int i = 0; i < columns; i++) + var outerCount = columnMajor ? columns : rows; + var innerCount = columnMajor ? rows : columns; + + for (var i = 0; i < outerCount; i++) { - var x = item.Width * i + item.X; - - for (int j = 0; j < rows; j++) + for (var j = 0; j < innerCount; j++) { - var y = item.Height * j + item.Y; + var x = (columnMajor ? i : j) * item.Width + item.X; + var y = (columnMajor ? j : i) * item.Height + item.Y; - var addedItem = item.Clone() as Item; - addedItem.Location = new Vector(x, y); - - items.Add(addedItem); - - if (items.Count == maxCount) - return items; - } - } - - return items; - } - - /// - /// Horizontal pattern. - /// - /// - /// - /// - /// - protected List HPattern(Item item, int rows, int columns, int maxCount) - { - var items = new List(); - - for (int i = 0; i < rows; i++) - { - var y = item.Height * i + item.Y; - - for (int j = 0; j < rows; j++) - { - var x = item.Width * j + item.X; - - var addedItem = item.Clone() as Item; - addedItem.Location = new Vector(x, y); - - items.Add(addedItem); + var clone = item.Clone() as Item; + clone.Location = new Vector(x, y); + items.Add(clone); if (items.Count == maxCount) return items; diff --git a/OpenNest.Engine/RectanglePacking/FillNoRotation.cs b/OpenNest.Engine/RectanglePacking/FillNoRotation.cs index 14ba44c..2f6e73a 100644 --- a/OpenNest.Engine/RectanglePacking/FillNoRotation.cs +++ b/OpenNest.Engine/RectanglePacking/FillNoRotation.cs @@ -61,10 +61,7 @@ namespace OpenNest.RectanglePacking columns = (int)System.Math.Ceiling((double)maxCount / rows); } - if (item.Width > item.Height) - VPattern(item, rows, columns, maxCount); - else - HPattern(item, rows, columns, maxCount); + Bin.Items.AddRange(FillGrid(item, rows, columns, maxCount, columnMajor: item.Width > item.Height)); } } }