From 708d895a049b79db13123b33a9594b1f317c170a Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Fri, 20 Mar 2026 14:43:38 -0400 Subject: [PATCH] perf: remove automatic angle sweep in linear fill Remove NeedsSweep that triggered a 5-degree sweep (36 angles) when the work area was narrower than the part. Position matters more than angle for narrow areas, and the base angles (bestRotation + 90deg) cover the useful cases. ForceFullSweep still works for training. Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest.Engine/Fill/AngleCandidateBuilder.cs | 14 +------------- OpenNest.Tests/AngleCandidateBuilderTests.cs | 10 ++++------ 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/OpenNest.Engine/Fill/AngleCandidateBuilder.cs b/OpenNest.Engine/Fill/AngleCandidateBuilder.cs index 670c459..9f2a1ec 100644 --- a/OpenNest.Engine/Fill/AngleCandidateBuilder.cs +++ b/OpenNest.Engine/Fill/AngleCandidateBuilder.cs @@ -27,7 +27,7 @@ namespace OpenNest.Engine.Fill var angles = new List(baseAngles); - if (NeedsSweep(item, bestRotation, workArea)) + if (ForceFullSweep) AddSweepAngles(angles); if (!ForceFullSweep && angles.Count > 2) @@ -36,18 +36,6 @@ namespace OpenNest.Engine.Fill return angles; } - private bool NeedsSweep(NestItem item, double bestRotation, Box workArea) - { - var testPart = new Part(item.Drawing); - if (!bestRotation.IsEqualTo(0)) - testPart.Rotate(bestRotation); - testPart.UpdateBounds(); - - var partLongestSide = System.Math.Max(testPart.BoundingBox.Width, testPart.BoundingBox.Length); - var workAreaShortSide = System.Math.Min(workArea.Width, workArea.Length); - return workAreaShortSide < partLongestSide || ForceFullSweep; - } - private static void AddSweepAngles(List angles) { var step = Angle.ToRadians(5); diff --git a/OpenNest.Tests/AngleCandidateBuilderTests.cs b/OpenNest.Tests/AngleCandidateBuilderTests.cs index a76313d..fa892a3 100644 --- a/OpenNest.Tests/AngleCandidateBuilderTests.cs +++ b/OpenNest.Tests/AngleCandidateBuilderTests.cs @@ -29,18 +29,16 @@ public class AngleCandidateBuilderTests } [Fact] - public void Build_NarrowWorkArea_ProducesMoreAngles() + public void Build_NarrowWorkArea_UsesBaseAnglesOnly() { var builder = new AngleCandidateBuilder(); var item = new NestItem { Drawing = MakeRectDrawing(20, 10) }; - var wideArea = new Box(0, 0, 100, 100); var narrowArea = new Box(0, 0, 100, 8); // narrower than part's longest side - var wideAngles = builder.Build(item, 0, wideArea); - var narrowAngles = builder.Build(item, 0, narrowArea); + var angles = builder.Build(item, 0, narrowArea); - Assert.True(narrowAngles.Count > wideAngles.Count, - $"Narrow ({narrowAngles.Count}) should have more angles than wide ({wideAngles.Count})"); + // Without ForceFullSweep, narrow areas use only base angles (0° and 90°) + Assert.Equal(2, angles.Count); } [Fact]