From dfd5a15274de66e114bcd94d2afc583c50bd2279 Mon Sep 17 00:00:00 2001 From: AJ Isaacs Date: Tue, 17 Mar 2026 08:04:15 -0400 Subject: [PATCH] feat(core): add TrapezoidShape Co-Authored-By: Claude Opus 4.6 (1M context) --- OpenNest.Core/Shapes/TrapezoidShape.cs | 27 ++++++++++++++++++++ OpenNest.Tests/Shapes/TrapezoidShapeTests.cs | 27 ++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100644 OpenNest.Core/Shapes/TrapezoidShape.cs create mode 100644 OpenNest.Tests/Shapes/TrapezoidShapeTests.cs diff --git a/OpenNest.Core/Shapes/TrapezoidShape.cs b/OpenNest.Core/Shapes/TrapezoidShape.cs new file mode 100644 index 0000000..1c56eeb --- /dev/null +++ b/OpenNest.Core/Shapes/TrapezoidShape.cs @@ -0,0 +1,27 @@ +using System.Collections.Generic; +using OpenNest.Geometry; + +namespace OpenNest.Shapes +{ + public class TrapezoidShape : ShapeDefinition + { + public double TopWidth { get; set; } + public double BottomWidth { get; set; } + public double Height { get; set; } + + public override Drawing GetDrawing() + { + var offset = (BottomWidth - TopWidth) / 2.0; + + var entities = new List + { + new Line(0, 0, BottomWidth, 0), + new Line(BottomWidth, 0, offset + TopWidth, Height), + new Line(offset + TopWidth, Height, offset, Height), + new Line(offset, Height, 0, 0) + }; + + return CreateDrawing(entities); + } + } +} diff --git a/OpenNest.Tests/Shapes/TrapezoidShapeTests.cs b/OpenNest.Tests/Shapes/TrapezoidShapeTests.cs new file mode 100644 index 0000000..0efbe80 --- /dev/null +++ b/OpenNest.Tests/Shapes/TrapezoidShapeTests.cs @@ -0,0 +1,27 @@ +using OpenNest.Shapes; + +namespace OpenNest.Tests.Shapes; + +public class TrapezoidShapeTests +{ + [Fact] + public void GetDrawing_BoundingBoxMatchesDimensions() + { + var shape = new TrapezoidShape { BottomWidth = 20, TopWidth = 10, Height = 8 }; + var drawing = shape.GetDrawing(); + + var bbox = drawing.Program.BoundingBox(); + Assert.Equal(20, bbox.Width, 0.01); + Assert.Equal(8, bbox.Length, 0.01); + } + + [Fact] + public void GetDrawing_AreaIsCorrect() + { + var shape = new TrapezoidShape { BottomWidth = 20, TopWidth = 10, Height = 8 }; + var drawing = shape.GetDrawing(); + + // Area = (top + bottom) / 2 * height = (10 + 20) / 2 * 8 = 120 + Assert.Equal(120, drawing.Area, 0.5); + } +}