Пример #1
0
        public void ReturnPointWithGreaterRadius_OnNextStep(int centerX, int centerY, double a, double b, double step)
        {
            var center            = new Point(centerX, centerY);
            var archimedeanSpiral = new ArchimedeanSpiral(center, step, a, b);
            var firstPoint        = archimedeanSpiral.GetNextPoint();
            var secondPoint       = archimedeanSpiral.GetNextPoint();
            var firstRadius       = GetDistance(center, firstPoint);
            var secondRadius      = GetDistance(center, secondPoint);

            secondRadius.Should().BeGreaterThan(firstRadius);
        }
Пример #2
0
        public Rectangle PutNextRectangle(Size rectangleSize)
        {
            var point            = archimedeanSpiral.GetNextPoint();
            var checkedRectangle = new Rectangle(point, rectangleSize);

            while (!IsCorrectToPlace(checkedRectangle))
            {
                point            = archimedeanSpiral.GetNextPoint();
                checkedRectangle = new Rectangle(point, rectangleSize);
            }

            var adjustedRectangle = AdjustRectangle(checkedRectangle);

            rectangles.Add(adjustedRectangle);
            return(adjustedRectangle);
        }
Пример #3
0
        public void ReturnCenterPointFirst_WithZeroA(int centerX, int centerY)
        {
            var center            = new Point(centerX, centerY);
            var archimedeanSpiral = new ArchimedeanSpiral(center, a: 0);

            archimedeanSpiral.GetNextPoint().Should().BeEquivalentTo(center);
        }
Пример #4
0
        public void ReturnCorrectPoints_OnNextSteps(int centerX, int centerY, double a, double b, double step, int stepsNumber)
        {
            var center            = new Point(centerX, centerY);
            var archimedeanSpiral = new ArchimedeanSpiral(center, step, a, b);

            for (var i = 0; i < stepsNumber; i++)
            {
                var nextPoint   = archimedeanSpiral.GetNextPoint();
                var pointRadius = GetDistance(center, nextPoint);
                var pointPhi    = step * i;
                pointRadius.Should().BeApproximately(GetArchimedeanSpiralRadius(a, b, pointPhi), 1);
            }
        }
Пример #5
0
        private Rectangle CreateRectangleOnSpiral(Size rectangleSize)
        {
            var shiftedCenter = Geometry.ShiftPointBySizeOffsets(spiral.Center, rectangleSize);
            var rectangle     = new Rectangle(shiftedCenter, rectangleSize);

            while (taggedRectangles.Any(otherRectangle => rectangle.IntersectsWith(otherRectangle)))
            {
                var spiralPoint = spiral.GetNextPoint();
                rectangle.X = shiftedCenter.X + spiralPoint.X;
                rectangle.Y = shiftedCenter.Y + spiralPoint.Y;
            }

            AlignSpiralDirection(rectangle);
            return(rectangle);
        }
Пример #6
0
        public void GetNextPoint_SavesDistance_DuringGeneration()
        {
            const int distance = 10;
            var       spiral   = new ArchimedeanSpiral(distance, 2 * Math.PI);
            var       points   = new List <PointF>();

            for (var i = 0; i < 1000; i++)
            {
                points.Add(spiral.GetNextPoint());
            }

            for (var i = 1; i < points.Count; i++)
            {
                GetSquaredDistance(points[i - 1], points[i])
                .Should().Be(distance * distance);
            }
        }
Пример #7
0
        public void GenerateNextPoint_SavesDelta_DuringGeneration()
        {
            const double delta   = Math.PI / 3;
            const double epsilon = Math.PI / 180;
            var          spiral  = new ArchimedeanSpiral(delta: delta);
            var          points  = new List <PointF>();

            for (var i = 0; i < 1000; i++)
            {
                points.Add(spiral.GetNextPoint());
            }

            for (var i = 1; i < points.Count; i++)
            {
                var previous = GetAngleToPoint(points[i - 1]);
                var current  = GetAngleToPoint(points[i]);
                CalculateAngleDifference(current, previous)
                .Should().BeInRange(delta - epsilon, delta + epsilon);
            }
        }
Пример #8
0
        public void GenerateNextPoint_ReturnsEmptyPoint_AtFirstGeneration(double distance, double delta)
        {
            var spiral = new ArchimedeanSpiral(distance, delta);

            spiral.GetNextPoint().Should().Be(PointF.Empty);
        }
Пример #9
0
 public void GetNextPoint_ShouldBeCloseToOriginOnFirstCall()
 {
     Point.Round(archimedeanSpiral.GetNextPoint()).Should().Be(new Point(0, 0));
 }