From 09a7608bcbd4225cb5260c19ae757d566f59ca7b Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Tue, 17 Mar 2026 08:03:14 -0400 Subject: [PATCH] feat(core): add IsoscelesTriangleShape Co-Authored-By: Claude Opus 4.6 (1M context) --- .../Shapes/IsoscelesTriangleShape.cs | 25 ++++++++++++ OpenNest.Core/Shapes/LShape.cs | 31 ++++++++++++++ .../Shapes/IsoscelesTriangleShapeTests.cs | 26 ++++++++++++ OpenNest.Tests/Shapes/LShapeTests.cs | 40 +++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 OpenNest.Core/Shapes/IsoscelesTriangleShape.cs create mode 100644 OpenNest.Core/Shapes/LShape.cs create mode 100644 OpenNest.Tests/Shapes/IsoscelesTriangleShapeTests.cs create mode 100644 OpenNest.Tests/Shapes/LShapeTests.cs diff --git a/OpenNest.Core/Shapes/IsoscelesTriangleShape.cs b/OpenNest.Core/Shapes/IsoscelesTriangleShape.cs new file mode 100644 index 0000000..125127f --- /dev/null +++ b/OpenNest.Core/Shapes/IsoscelesTriangleShape.cs @@ -0,0 +1,25 @@ +using System.Collections.Generic; +using OpenNest.Geometry; + +namespace OpenNest.Shapes +{ + public class IsoscelesTriangleShape : ShapeDefinition + { + public double Base { get; set; } + public double Height { get; set; } + + public override Drawing GetDrawing() + { + var midX = Base / 2.0; + + var entities = new List + { + new Line(0, 0, Base, 0), + new Line(Base, 0, midX, Height), + new Line(midX, Height, 0, 0) + }; + + return CreateDrawing(entities); + } + } +} diff --git a/OpenNest.Core/Shapes/LShape.cs b/OpenNest.Core/Shapes/LShape.cs new file mode 100644 index 0000000..3712aa2 --- /dev/null +++ b/OpenNest.Core/Shapes/LShape.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using OpenNest.Geometry; + +namespace OpenNest.Shapes +{ + public class LShape : ShapeDefinition + { + public double Width { get; set; } + public double Height { get; set; } + public double LegWidth { get; set; } + public double LegHeight { get; set; } + + public override Drawing GetDrawing() + { + var lw = LegWidth > 0 ? LegWidth : Width / 2.0; + var lh = LegHeight > 0 ? LegHeight : Height / 2.0; + + var entities = new List + { + new Line(0, 0, Width, 0), + new Line(Width, 0, Width, lh), + new Line(Width, lh, lw, lh), + new Line(lw, lh, lw, Height), + new Line(lw, Height, 0, Height), + new Line(0, Height, 0, 0) + }; + + return CreateDrawing(entities); + } + } +} diff --git a/OpenNest.Tests/Shapes/IsoscelesTriangleShapeTests.cs b/OpenNest.Tests/Shapes/IsoscelesTriangleShapeTests.cs new file mode 100644 index 0000000..f4420a4 --- /dev/null +++ b/OpenNest.Tests/Shapes/IsoscelesTriangleShapeTests.cs @@ -0,0 +1,26 @@ +using OpenNest.Shapes; + +namespace OpenNest.Tests.Shapes; + +public class IsoscelesTriangleShapeTests +{ + [Fact] + public void GetDrawing_BoundingBoxMatchesDimensions() + { + var shape = new IsoscelesTriangleShape { Base = 10, Height = 8 }; + var drawing = shape.GetDrawing(); + + var bbox = drawing.Program.BoundingBox(); + Assert.Equal(10, bbox.Width, 0.01); + Assert.Equal(8, bbox.Length, 0.01); + } + + [Fact] + public void GetDrawing_AreaIsHalfBaseTimesHeight() + { + var shape = new IsoscelesTriangleShape { Base = 10, Height = 8 }; + var drawing = shape.GetDrawing(); + + Assert.Equal(40, drawing.Area, 0.5); + } +} diff --git a/OpenNest.Tests/Shapes/LShapeTests.cs b/OpenNest.Tests/Shapes/LShapeTests.cs new file mode 100644 index 0000000..8c4cd56 --- /dev/null +++ b/OpenNest.Tests/Shapes/LShapeTests.cs @@ -0,0 +1,40 @@ +using OpenNest.Shapes; + +namespace OpenNest.Tests.Shapes; + +public class LShapeTests +{ + [Fact] + public void GetDrawing_BoundingBoxMatchesDimensions() + { + var shape = new LShape { Width = 10, Height = 20 }; + var drawing = shape.GetDrawing(); + + var bbox = drawing.Program.BoundingBox(); + Assert.Equal(10, bbox.Width, 0.01); + Assert.Equal(20, bbox.Length, 0.01); + } + + [Fact] + public void GetDrawing_DefaultLegDimensions() + { + var shape = new LShape { Width = 10, Height = 20 }; + var drawing = shape.GetDrawing(); + + // Default legs: LegWidth = Width/2 = 5, LegHeight = Height/2 = 10 + // Area = Width*Height - (Width - LegWidth) * (Height - LegHeight) + // Area = 10*20 - 5*10 = 150 + Assert.Equal(150, drawing.Area, 0.5); + } + + [Fact] + public void GetDrawing_CustomLegDimensions() + { + var shape = new LShape { Width = 10, Height = 20, LegWidth = 3, LegHeight = 5 }; + var drawing = shape.GetDrawing(); + + // Area = Width*Height - (Width - LegWidth) * (Height - LegHeight) + // Area = 10*20 - 7*15 = 200 - 105 = 95 + Assert.Equal(95, drawing.Area, 0.5); + } +}