perf(engine): inline bounding box computation in FillScore
Compute min/max bounds in a single pass alongside part area accumulation, avoiding the separate GetBoundingBox() call and redundant iteration. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -41,39 +41,32 @@ namespace OpenNest
|
|||||||
return default;
|
return default;
|
||||||
|
|
||||||
var totalPartArea = 0.0;
|
var totalPartArea = 0.0;
|
||||||
|
var minX = double.MaxValue;
|
||||||
|
var minY = double.MaxValue;
|
||||||
|
var maxX = double.MinValue;
|
||||||
|
var maxY = double.MinValue;
|
||||||
|
|
||||||
foreach (var part in parts)
|
foreach (var part in parts)
|
||||||
|
{
|
||||||
totalPartArea += part.BaseDrawing.Area;
|
totalPartArea += part.BaseDrawing.Area;
|
||||||
|
var bb = part.BoundingBox;
|
||||||
|
|
||||||
var bbox = ((IEnumerable<IBoundable>)parts).GetBoundingBox();
|
if (bb.Left < minX) minX = bb.Left;
|
||||||
var bboxArea = bbox.Area();
|
if (bb.Bottom < minY) minY = bb.Bottom;
|
||||||
|
if (bb.Right > maxX) maxX = bb.Right;
|
||||||
|
if (bb.Top > maxY) maxY = bb.Top;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bboxArea = (maxX - minX) * (maxY - minY);
|
||||||
var density = bboxArea > 0 ? totalPartArea / bboxArea : 0;
|
var density = bboxArea > 0 ? totalPartArea / bboxArea : 0;
|
||||||
|
|
||||||
var usableRemnantArea = ComputeUsableRemnantArea(parts, workArea);
|
var usableRemnantArea = ComputeUsableRemnantArea(maxX, maxY, workArea);
|
||||||
|
|
||||||
return new FillScore(parts.Count, usableRemnantArea, density);
|
return new FillScore(parts.Count, usableRemnantArea, density);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
private static double ComputeUsableRemnantArea(double maxRight, double maxTop, Box workArea)
|
||||||
/// Finds the largest usable remnant (short side >= MinRemnantDimension)
|
|
||||||
/// by checking right and top edge strips between placed parts and the work area boundary.
|
|
||||||
/// </summary>
|
|
||||||
private static double ComputeUsableRemnantArea(List<Part> parts, Box workArea)
|
|
||||||
{
|
{
|
||||||
var maxRight = double.MinValue;
|
|
||||||
var maxTop = double.MinValue;
|
|
||||||
|
|
||||||
foreach (var part in parts)
|
|
||||||
{
|
|
||||||
var bb = part.BoundingBox;
|
|
||||||
|
|
||||||
if (bb.Right > maxRight)
|
|
||||||
maxRight = bb.Right;
|
|
||||||
|
|
||||||
if (bb.Top > maxTop)
|
|
||||||
maxTop = bb.Top;
|
|
||||||
}
|
|
||||||
|
|
||||||
var largest = 0.0;
|
var largest = 0.0;
|
||||||
|
|
||||||
// Right strip
|
// Right strip
|
||||||
|
|||||||
Reference in New Issue
Block a user