static Shape <double> CreatePathShape(ConvolutionFactory factory) { var pathSegment = factory.CreateSegment( startX: 0.0, startY: 0.0, endX: 1.0, endY: 2.0, weight: 1); var pathReverseSegment = factory.CreateSegment( startX: 1.0, startY: 2.0, endX: 0.0, endY: 0.0, weight: 1); var smoothingArc1 = factory.CreateArc( pathSegment.Start, factory.CreateDirectionRange( pathReverseSegment.Direction.NormalDirection().Opposite(), pathSegment.Direction.NormalDirection().Opposite(), Orientation.CounterClockwise), 0.0, 1); var smoothingArc2 = factory.CreateArc( pathReverseSegment.Start, factory.CreateDirectionRange( pathSegment.Direction.NormalDirection().Opposite(), pathReverseSegment.Direction.NormalDirection().Opposite(), Orientation.CounterClockwise), 0.0, 1); return(factory.CreateShape( new Tracing <double>[] { smoothingArc1, pathSegment, smoothingArc2, pathReverseSegment })); }
public void Working_Example_From_Readme_Should_Compile_And_Produce_Correct_Results() { var factory = new ConvolutionFactory(); var disk = CreateDiskShape(factory); var pathShape = CreatePathShape(factory); var minkowskiSum = factory.ConvolveShapes(disk, pathShape); minkowskiSum.ConvolvedTracings.Should().HaveCount(5);
static Shape <double> CreateDiskShape(ConvolutionFactory factory) { var eastDirection = factory.CreateDirection(1.0, 0.0); var diskArc = factory.CreateArc( center: factory.CreatePoint(0.0, 0.0), directions: factory.CreateDirectionRange(eastDirection, eastDirection, Orientation.CounterClockwise), radius: 1.0, weight: 1); return(factory.CreateShape(new[] { diskArc })); }
public void Direction_Determinant_Should_Have_Expected_Sign() { var factory = new ConvolutionFactory(); var d1 = factory.CreateDirection(1.0, 1.0); var d2 = factory.CreateDirection(-1.0, 1.0); var determinant1 = d1.Determinant(d2); var determinant2 = d2.Determinant(d1); determinant1.Should().BeApproximately(2.0, EqualityTolerance); determinant1.Should().BeGreaterThan(0.0); determinant2.Should().BeLessThan(0.0); }
public void When_Start_Direction_Coincide_With_End_Then_Expected_Range_Should_Be_Returned( Orientation orientation, IEnumerable <DirectionRange <double> > expectedRange) { var factory = new ConvolutionFactory(); var d1 = factory.CreateDirection(0.0, 1.0); var d2 = factory.CreateDirection(0.0, -1.0); var leftHalfPlan = factory.CreateDirectionRange(d1, d2, Orientation.Clockwise); var rightHalfPlan = factory.CreateDirectionRange(d1, d2, orientation); var intersection = leftHalfPlan.Intersection(rightHalfPlan); intersection.Should().BeEquivalentTo(expectedRange); }
public void When_calling_Union_with_a_single_element_then_it_should_be_returned() { // Arrange var factory = new ConvolutionFactory(); var d1 = factory.CreateDirection(1.0, 0.0); var d2 = factory.CreateDirection(0.0, 1.0); var range = factory.CreateDirectionRange(d1, d2, Orientation.CounterClockwise); var ranges = new[] { range }; // Act var union = ranges.Union(); // Assert union.Single().Should().Be(range); }
public void IsShortestRange_Should_Return_Expected_Result() { var factory = new ConvolutionFactory(); var d1 = factory.CreateDirection(1.0, 0.0); var d2 = factory.CreateDirection(0.0, 1.0); var range1 = factory.CreateDirectionRange(d1, d2, Orientation.CounterClockwise); var range2 = factory.CreateDirectionRange(d1, d2, Orientation.Clockwise); var range3 = factory.CreateDirectionRange(d2, d1, Orientation.CounterClockwise); var range4 = factory.CreateDirectionRange(d2, d1, Orientation.Clockwise); range1.IsShortestRange().Should().BeTrue(); range2.IsShortestRange().Should().BeFalse(); range3.IsShortestRange().Should().BeFalse(); range4.IsShortestRange().Should().BeTrue(); }
public static IEnumerable <TestCaseData> TestCases() { var factory = new ConvolutionFactory(); yield return(new TestCaseData( Orientation.CounterClockwise, Enumerable.Empty <DirectionRange <double> >())); yield return(new TestCaseData( Orientation.Clockwise, new [] { factory.CreateDirectionRange( factory.CreateDirection(0, 1), factory.CreateDirection(0, -1), Orientation.Clockwise) })); }
public void When_Direction_Range_Is_Exactly_A_Half_Plan_Then_The_Shortest_Range_Should_Be_Clockwise() { var factory = new ConvolutionFactory(); var d1 = factory.CreateDirection(1.0, 0.0); var d2 = factory.CreateDirection(-1.0, 0.0); var shortestRange1 = factory.CreateDirectionRange(d1, d2, Orientation.Clockwise); var shortestRange2 = factory.CreateDirectionRange(d2, d1, Orientation.Clockwise); var longestRange1 = factory.CreateDirectionRange(d1, d2, Orientation.CounterClockwise); var longestRange2 = factory.CreateDirectionRange(d2, d1, Orientation.CounterClockwise); shortestRange1.IsShortestRange().Should().BeTrue(); shortestRange2.IsShortestRange().Should().BeTrue(); longestRange1.IsShortestRange().Should().BeFalse(); longestRange2.IsShortestRange().Should().BeFalse(); }
public void When_Direction_Is_Given_Then_BelongsTo_Should_Return_Expected_Result() { var factory = new ConvolutionFactory(); var east = factory.CreateDirection(1.0, 0.0); var north = factory.CreateDirection(0.0, 1.0); var clockwiseRange = factory.CreateDirectionRange(east, north, Orientation.Clockwise); var counterClockwiseRange = factory.CreateDirectionRange(east, north, Orientation.CounterClockwise); var northEast = factory.CreateDirection(1.0, 1.0); var southWest = northEast.Opposite(); northEast.BelongsTo(clockwiseRange).Should().BeFalse(); northEast.BelongsTo(counterClockwiseRange).Should().BeTrue(); southWest.BelongsTo(clockwiseRange).Should().BeTrue(); southWest.BelongsTo(counterClockwiseRange).Should().BeFalse(); }
public void SetUp() { var calculator = new DoubleAlgebraicNumberCalculator(); _factory = new ConvolutionFactory <double>(calculator); var segment = _factory.CreateSegment( startX: 10, startY: 5, endX: 15, endY: 10, weight: 4); var tracings = new List <Tracing <double> > { segment }; _shape1 = new Shape <double>(tracings); _shape2 = new Shape <double>(tracings); _convolvedTracings = new List <ConvolvedTracing <double> >(); }
public void When_Direction_Ranges_Are_Included_Then_Intersection_Should_Be_The_Innermost_Range() { const double radius1 = 2.0; const double radius2 = 2.0; var convolutionFactory = new ConvolutionFactory(); var arc1 = convolutionFactory.CreateArc( centerX: 1.0, centerY: 2.0, directionStartX: 1.0, directionStartY: 0.0, directionEndX: 0.0, directionEndY: 1.0, orientation: Orientation.CounterClockwise, radius: radius1, weight: 1); var arc2 = convolutionFactory.CreateArc( centerX: 2.0, centerY: 1.0, directionStartX: 1.0, directionStartY: 0.5, directionEndX: 0.5, directionEndY: 1.0, orientation: Orientation.CounterClockwise, radius: radius2, weight: 1); var convolution = convolutionFactory.ConvolveTracings(arc1, arc2).ToList(); convolution.Should().HaveCount(1); convolution[0].Convolution.Should().BeOfType(typeof(Arc <double>)); var convolutionAsArc = (Arc <double>)convolution[0].Convolution; convolutionAsArc.Center.Should().BeEquivalentTo(convolutionFactory.CreatePoint(3.0, 3.0)); }
public void When_Direction_Is_Close_To_Range_Boundary_Then_BelongsTo_Should_Return_Expected_Result() { var factory = new ConvolutionFactory(); var northEast = factory.CreateDirection(1.0, 1.0); var northWest = factory.CreateDirection(-1.0, 1.0); var range = factory.CreateDirectionRange(northEast, northWest, Orientation.CounterClockwise); const double perturbation = 1.0e-2; var d1 = factory.CreateDirection(1.0 + perturbation, 1.0); var d2 = factory.CreateDirection(1.0 - perturbation, 1.0); var d3 = factory.CreateDirection(-1.0 + perturbation, 1.0); var d4 = factory.CreateDirection(-1.0 - perturbation, 1.0); d1.BelongsTo(range).Should().BeFalse(); d2.BelongsTo(range).Should().BeTrue(); d3.BelongsTo(range).Should().BeTrue(); d4.BelongsTo(range).Should().BeFalse(); }
public void SetUp() { var factory = new ConvolutionFactory(); _calculator = factory.AlgebraicNumberCalculator; }
public void SetUp() { var calculator = new DoubleAlgebraicNumberCalculator(); _factory = new ConvolutionFactory <double>(calculator); }