From 74272bea8073e2f3f0c148ac6f60f207e8566a25 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Sat, 14 Mar 2026 14:41:30 -0400 Subject: [PATCH] feat(engine): add perimeter-to-area ratio to part features Adds PerimeterToAreaRatio (perimeter / area) as a spacing sensitivity indicator for ML feature extraction. Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest.Engine/ML/FeatureExtractor.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/OpenNest.Engine/ML/FeatureExtractor.cs b/OpenNest.Engine/ML/FeatureExtractor.cs index 640c723..c940105 100644 --- a/OpenNest.Engine/ML/FeatureExtractor.cs +++ b/OpenNest.Engine/ML/FeatureExtractor.cs @@ -13,6 +13,7 @@ namespace OpenNest.Engine.ML public double AspectRatio { get; set; } // Width / Length public double BoundingBoxFill { get; set; } // Area / (Width * Length) public double Circularity { get; set; } // 4 * PI * Area / Perimeter^2 + public double PerimeterToAreaRatio { get; set; } // Perimeter / Area — spacing sensitivity public int VertexCount { get; set; } // --- Normalized Bitmask (32x32 = 1024 features) --- @@ -20,7 +21,7 @@ namespace OpenNest.Engine.ML public override string ToString() { - return $"{Area:F2},{Convexity:F4},{AspectRatio:F4},{BoundingBoxFill:F4},{Circularity:F4},{VertexCount}"; + return $"{Area:F2},{Convexity:F4},{AspectRatio:F4},{BoundingBoxFill:F4},{Circularity:F4},{PerimeterToAreaRatio:F4},{VertexCount}"; } } @@ -57,6 +58,7 @@ namespace OpenNest.Engine.ML // Circularity = 4 * PI * Area / Perimeter^2 var perimeterLen = polygon.Perimeter(); features.Circularity = (4 * System.Math.PI * drawing.Area) / (perimeterLen * perimeterLen); + features.PerimeterToAreaRatio = drawing.Area > 0 ? perimeterLen / drawing.Area : 0; return features; }