From 641734ba70492b83750faeb8a333b9627dbf6646 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Tue, 17 Mar 2026 08:00:11 -0400 Subject: [PATCH] feat(core): add RingShape Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest.Core/Shapes/RingShape.cs | 22 +++++++++++++++ OpenNest.Tests/Shapes/RingShapeTests.cs | 37 +++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 OpenNest.Core/Shapes/RingShape.cs create mode 100644 OpenNest.Tests/Shapes/RingShapeTests.cs diff --git a/OpenNest.Core/Shapes/RingShape.cs b/OpenNest.Core/Shapes/RingShape.cs new file mode 100644 index 0000000..2b22783 --- /dev/null +++ b/OpenNest.Core/Shapes/RingShape.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using OpenNest.Geometry; + +namespace OpenNest.Shapes +{ + public class RingShape : ShapeDefinition + { + public double OuterDiameter { get; set; } + public double InnerDiameter { get; set; } + + public override Drawing GetDrawing() + { + var entities = new List + { + new Circle(0, 0, OuterDiameter / 2.0), + new Circle(0, 0, InnerDiameter / 2.0) + }; + + return CreateDrawing(entities); + } + } +} diff --git a/OpenNest.Tests/Shapes/RingShapeTests.cs b/OpenNest.Tests/Shapes/RingShapeTests.cs new file mode 100644 index 0000000..acbedd7 --- /dev/null +++ b/OpenNest.Tests/Shapes/RingShapeTests.cs @@ -0,0 +1,37 @@ +using OpenNest.Shapes; + +namespace OpenNest.Tests.Shapes; + +public class RingShapeTests +{ + [Fact] + public void GetDrawing_BoundingBoxMatchesOuterDiameter() + { + var shape = new RingShape { OuterDiameter = 20, InnerDiameter = 10 }; + var drawing = shape.GetDrawing(); + + var bbox = drawing.Program.BoundingBox(); + Assert.Equal(20, bbox.Width, 0.01); + Assert.Equal(20, bbox.Length, 0.01); + } + + [Fact] + public void GetDrawing_AreaExcludesInnerHole() + { + var shape = new RingShape { OuterDiameter = 20, InnerDiameter = 10 }; + var drawing = shape.GetDrawing(); + + // Area = pi * (10^2 - 5^2) = pi * 75 + var expectedArea = System.Math.PI * 75; + Assert.Equal(expectedArea, drawing.Area, 0.5); + } + + [Fact] + public void GetDrawing_DefaultName_IsRing() + { + var shape = new RingShape { OuterDiameter = 20, InnerDiameter = 10 }; + var drawing = shape.GetDrawing(); + + Assert.Equal("Ring", drawing.Name); + } +}