feat: add ISplitFeature interface and StraightSplit implementation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
22
OpenNest.Core/Splitting/ISplitFeature.cs
Normal file
22
OpenNest.Core/Splitting/ISplitFeature.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using System.Collections.Generic;
|
||||
using OpenNest.Geometry;
|
||||
|
||||
namespace OpenNest;
|
||||
|
||||
public class SplitFeatureResult
|
||||
{
|
||||
public List<Entity> NegativeSideEdge { get; }
|
||||
public List<Entity> PositiveSideEdge { get; }
|
||||
|
||||
public SplitFeatureResult(List<Entity> negativeSideEdge, List<Entity> positiveSideEdge)
|
||||
{
|
||||
NegativeSideEdge = negativeSideEdge;
|
||||
PositiveSideEdge = positiveSideEdge;
|
||||
}
|
||||
}
|
||||
|
||||
public interface ISplitFeature
|
||||
{
|
||||
string Name { get; }
|
||||
SplitFeatureResult GenerateFeatures(SplitLine line, double extentStart, double extentEnd, SplitParameters parameters);
|
||||
}
|
||||
22
OpenNest.Core/Splitting/StraightSplit.cs
Normal file
22
OpenNest.Core/Splitting/StraightSplit.cs
Normal file
@@ -0,0 +1,22 @@
|
||||
using System.Collections.Generic;
|
||||
using OpenNest.Geometry;
|
||||
|
||||
namespace OpenNest;
|
||||
|
||||
public class StraightSplit : ISplitFeature
|
||||
{
|
||||
public string Name => "Straight";
|
||||
|
||||
public SplitFeatureResult GenerateFeatures(SplitLine line, double extentStart, double extentEnd, SplitParameters parameters)
|
||||
{
|
||||
var (negEdge, posEdge) = line.Axis == CutOffAxis.Vertical
|
||||
? (new Line(new Vector(line.Position, extentStart), new Vector(line.Position, extentEnd)),
|
||||
new Line(new Vector(line.Position, extentEnd), new Vector(line.Position, extentStart)))
|
||||
: (new Line(new Vector(extentStart, line.Position), new Vector(extentEnd, line.Position)),
|
||||
new Line(new Vector(extentEnd, line.Position), new Vector(extentStart, line.Position)));
|
||||
|
||||
return new SplitFeatureResult(
|
||||
new List<Entity> { negEdge },
|
||||
new List<Entity> { posEdge });
|
||||
}
|
||||
}
|
||||
52
OpenNest.Tests/Splitting/SplitFeatureTests.cs
Normal file
52
OpenNest.Tests/Splitting/SplitFeatureTests.cs
Normal file
@@ -0,0 +1,52 @@
|
||||
using OpenNest.Geometry;
|
||||
|
||||
namespace OpenNest.Tests.Splitting;
|
||||
|
||||
public class SplitFeatureTests
|
||||
{
|
||||
[Fact]
|
||||
public void StraightSplit_Vertical_ProducesSingleLineEachSide()
|
||||
{
|
||||
var feature = new StraightSplit();
|
||||
var line = new SplitLine(50.0, CutOffAxis.Vertical);
|
||||
var parameters = new SplitParameters { Type = SplitType.Straight };
|
||||
|
||||
var result = feature.GenerateFeatures(line, 10.0, 90.0, parameters);
|
||||
|
||||
Assert.Single(result.NegativeSideEdge);
|
||||
var negLine = Assert.IsType<Line>(result.NegativeSideEdge[0]);
|
||||
Assert.Equal(50.0, negLine.StartPoint.X, 6);
|
||||
Assert.Equal(10.0, negLine.StartPoint.Y, 6);
|
||||
Assert.Equal(50.0, negLine.EndPoint.X, 6);
|
||||
Assert.Equal(90.0, negLine.EndPoint.Y, 6);
|
||||
|
||||
Assert.Single(result.PositiveSideEdge);
|
||||
var posLine = Assert.IsType<Line>(result.PositiveSideEdge[0]);
|
||||
Assert.Equal(50.0, posLine.StartPoint.X, 6);
|
||||
Assert.Equal(90.0, posLine.StartPoint.Y, 6);
|
||||
Assert.Equal(50.0, posLine.EndPoint.X, 6);
|
||||
Assert.Equal(10.0, posLine.EndPoint.Y, 6);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void StraightSplit_Horizontal_ProducesSingleLineEachSide()
|
||||
{
|
||||
var feature = new StraightSplit();
|
||||
var line = new SplitLine(40.0, CutOffAxis.Horizontal);
|
||||
var parameters = new SplitParameters { Type = SplitType.Straight };
|
||||
|
||||
var result = feature.GenerateFeatures(line, 5.0, 95.0, parameters);
|
||||
|
||||
var negLine = Assert.IsType<Line>(result.NegativeSideEdge[0]);
|
||||
Assert.Equal(5.0, negLine.StartPoint.X, 6);
|
||||
Assert.Equal(40.0, negLine.StartPoint.Y, 6);
|
||||
Assert.Equal(95.0, negLine.EndPoint.X, 6);
|
||||
Assert.Equal(40.0, negLine.EndPoint.Y, 6);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void StraightSplit_Name()
|
||||
{
|
||||
Assert.Equal("Straight", new StraightSplit().Name);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user