Esempio n. 1
0
            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 }));
            }
Esempio n. 2
0
        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);
Esempio n. 3
0
            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 }));
            }
Esempio n. 4
0
        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();
        }
Esempio n. 8
0
        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();
        }
Esempio n. 10
0
        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> >();
        }
Esempio n. 12
0
        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));
        }
Esempio n. 13
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();
        }
Esempio n. 14
0
        public void SetUp()
        {
            var factory = new ConvolutionFactory();

            _calculator = factory.AlgebraicNumberCalculator;
        }
Esempio n. 15
0
        public void SetUp()
        {
            var calculator = new DoubleAlgebraicNumberCalculator();

            _factory = new ConvolutionFactory <double>(calculator);
        }