From 94850795cf24ce43a624c332f56bbcf0b1d50187 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Mon, 9 Mar 2026 23:10:44 -0400 Subject: [PATCH] =?UTF-8?q?perf:=20replace=20O(p=C2=B2)=20startOffset=20lo?= =?UTF-8?q?op=20with=20O(p)=20pass=20in=20FindPatternCopyDistance?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit max(aUpper_i - bLower_j) across all pairs simplifies to max(aUpper) - min(bLower), computed in a single pass. Co-Authored-By: Claude Opus 4.6 --- OpenNest.Engine/FillLinear.cs | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/OpenNest.Engine/FillLinear.cs b/OpenNest.Engine/FillLinear.cs index 316f5f2..2778732 100644 --- a/OpenNest.Engine/FillLinear.cs +++ b/OpenNest.Engine/FillLinear.cs @@ -102,25 +102,23 @@ namespace OpenNest // Compute a starting offset large enough that every part-pair in // patternB has its offset geometry beyond patternA's offset geometry. - var startOffset = bboxDim; + // max(aUpper_i - bLower_j) = max(aUpper) - min(bLower). + var maxUpper = double.MinValue; + var minLower = double.MaxValue; for (var i = 0; i < patternA.Parts.Count; i++) { - var aUpper = direction == NestDirection.Horizontal - ? patternA.Parts[i].BoundingBox.Right : patternA.Parts[i].BoundingBox.Top; + var bb = patternA.Parts[i].BoundingBox; + var upper = direction == NestDirection.Horizontal ? bb.Right : bb.Top; + var lower = direction == NestDirection.Horizontal ? bb.Left : bb.Bottom; - for (var j = 0; j < patternA.Parts.Count; j++) - { - var bLower = direction == NestDirection.Horizontal - ? patternA.Parts[j].BoundingBox.Left : patternA.Parts[j].BoundingBox.Bottom; - - var required = aUpper - bLower + PartSpacing + Tolerance.Epsilon; - - if (required > startOffset) - startOffset = required; - } + if (upper > maxUpper) maxUpper = upper; + if (lower < minLower) minLower = lower; } + var startOffset = System.Math.Max(bboxDim, + maxUpper - minLower + PartSpacing + Tolerance.Epsilon); + var offset = MakeOffset(direction, startOffset); // Pre-compute stationary lines for patternA parts.