Box constructor and derived properties (Right, Top, Center, Translate, Offset) had Width and Length swapped — Length is X axis, Width is Y axis. Corrected across Core geometry, plate bounding box, rectangle packing, fill algorithms, tests, and UI renderers. Added FillSpiral with center remnant detection and recursive FillBest on the gap between the 4 spiral quadrants. RectFill.FillBest now compares spiral+center vs full best-fit fairly. BestCombination returns a CombinationResult record instead of out params. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
39 lines
1.1 KiB
C#
39 lines
1.1 KiB
C#
using OpenNest.Math;
|
|
|
|
namespace OpenNest
|
|
{
|
|
internal record CombinationResult(bool Found, int Count1, int Count2);
|
|
|
|
internal static class BestCombination
|
|
{
|
|
public static CombinationResult FindFrom2(double length1, double length2, double overallLength)
|
|
{
|
|
overallLength += Tolerance.Epsilon;
|
|
var count1 = 0;
|
|
var count2 = 0;
|
|
|
|
var maxCount1 = (int)System.Math.Floor(overallLength / length1);
|
|
var bestRemnant = overallLength + 1;
|
|
|
|
for (var c1 = 0; c1 <= maxCount1; c1++)
|
|
{
|
|
var remaining = overallLength - c1 * length1;
|
|
var c2 = (int)System.Math.Floor(remaining / length2);
|
|
var remnant = remaining - c2 * length2;
|
|
|
|
if (!(remnant < bestRemnant))
|
|
continue;
|
|
|
|
count1 = c1;
|
|
count2 = c2;
|
|
bestRemnant = remnant;
|
|
|
|
if (remnant.IsEqualTo(0))
|
|
break;
|
|
}
|
|
|
|
return new CombinationResult(count1 > 0 || count2 > 0, count1, count2);
|
|
}
|
|
}
|
|
}
|