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); }
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); }
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); }
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); } }
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); }
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); } }
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); } }
public void GenerateNextPoint_ReturnsEmptyPoint_AtFirstGeneration(double distance, double delta) { var spiral = new ArchimedeanSpiral(distance, delta); spiral.GetNextPoint().Should().Be(PointF.Empty); }
public void GetNextPoint_ShouldBeCloseToOriginOnFirstCall() { Point.Round(archimedeanSpiral.GetNextPoint()).Should().Be(new Point(0, 0)); }