From 913b724f1864ad198b91713ad788e8518bc9ff6e Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Fri, 8 Nov 2024 14:46:05 +0500 Subject: [PATCH 01/19] created project TagsCloudVisualization --- .../CircularCloudLayouterTest.cs | 16 ++++++++++++++ .../TagsCloudVisualization.Tests.csproj | 19 ++++++++++++++++ .../TagsCloudVisualization.sln | 22 +++++++++++++++++++ .../CircularCloudLayouter.cs | 16 ++++++++++++++ .../TagsCloudVisualization/Program.cs | 3 +++ .../TagsCloudVisualization.csproj | 10 +++++++++ 6 files changed, 86 insertions(+) create mode 100644 TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs create mode 100644 TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj create mode 100644 TagsCloudVisualization/TagsCloudVisualization.sln create mode 100644 TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs create mode 100644 TagsCloudVisualization/TagsCloudVisualization/Program.cs create mode 100644 TagsCloudVisualization/TagsCloudVisualization/TagsCloudVisualization.csproj diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs new file mode 100644 index 000000000..5ef426ba5 --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs @@ -0,0 +1,16 @@ +using NUnit.Framework; +using TagsCloudVisualization; + +namespace TagsCloudVisualization.Tests; + +[TestFixture] +[TestOf(typeof(CircularCloudLayouter))] +public class CircularCloudLayouterTest +{ + + [Test] + public void METHOD() + { + + } +} \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj b/TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj new file mode 100644 index 000000000..96e93e3a0 --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj @@ -0,0 +1,19 @@ + + + + net8.0 + + false + + + + + + + + + + + + + \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization.sln b/TagsCloudVisualization/TagsCloudVisualization.sln new file mode 100644 index 000000000..f38858b1d --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagsCloudVisualization", "TagsCloudVisualization\TagsCloudVisualization.csproj", "{B36FD3AA-D116-4E5B-AC96-83504630043E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagsCloudVisualization.Tests", "TagsCloudVisualization.Tests\TagsCloudVisualization.Tests.csproj", "{ABA2723C-4180-4BE8-AD07-0EFE58FF6912}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B36FD3AA-D116-4E5B-AC96-83504630043E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B36FD3AA-D116-4E5B-AC96-83504630043E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B36FD3AA-D116-4E5B-AC96-83504630043E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B36FD3AA-D116-4E5B-AC96-83504630043E}.Release|Any CPU.Build.0 = Release|Any CPU + {ABA2723C-4180-4BE8-AD07-0EFE58FF6912}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ABA2723C-4180-4BE8-AD07-0EFE58FF6912}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ABA2723C-4180-4BE8-AD07-0EFE58FF6912}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ABA2723C-4180-4BE8-AD07-0EFE58FF6912}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs new file mode 100644 index 000000000..1fbadaae1 --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs @@ -0,0 +1,16 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public class CircularCloudLayouter +{ + public CircularCloudLayouter(Point center) + { + + } + + public Rectangle PutNextRectangle(Size rectangleSize) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization/Program.cs b/TagsCloudVisualization/TagsCloudVisualization/Program.cs new file mode 100644 index 000000000..e5dff12bc --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization/Program.cs @@ -0,0 +1,3 @@ +// See https://aka.ms/new-console-template for more information + +Console.WriteLine("Hello, World!"); \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization/TagsCloudVisualization.csproj b/TagsCloudVisualization/TagsCloudVisualization/TagsCloudVisualization.csproj new file mode 100644 index 000000000..2f4fc7765 --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization/TagsCloudVisualization.csproj @@ -0,0 +1,10 @@ + + + + Exe + net8.0 + enable + enable + + + From 5fe72b2bbe31be53751b5c2d43bb3e434f6884e0 Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Fri, 8 Nov 2024 20:59:08 +0500 Subject: [PATCH 02/19] added tests for CircularCloudLayouter --- .../CircularCloudLayouterTest.cs | 269 +++++++++++++++++- .../TagsCloudVisualization.Tests.csproj | 1 + 2 files changed, 269 insertions(+), 1 deletion(-) diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs index 5ef426ba5..ef0ef0eba 100644 --- a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs @@ -1,3 +1,8 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using FluentAssertions; using NUnit.Framework; using TagsCloudVisualization; @@ -9,8 +14,270 @@ public class CircularCloudLayouterTest { [Test] - public void METHOD() + [Description("Проверяем, что прямоугольники не пересекаются друг с другом")] + [TestCaseSource(nameof(IntersectionTestSource))] + public void RectanglesShouldNotIntersectEachOther( + int centerX, + int centerY, + params (int, int)[] sizes) { + var circularCloudLayouter = Arrange(centerX, centerY); + + var rectangles = GenerateLayout(sizes, circularCloudLayouter); + + Assert_RectanglesDoNotIntersect(rectangles); + } + + [Test] + [Description("Проверяем, что центр прямоугольника, размер которого был передан первым " + + "совпадает с центром, переданным в аргумент конструктора CircularCloudLayouter")] + [TestCaseSource(nameof(FirstRectanglePositionTestSource))] + public void FirstRectangleShouldBePositionedAtProvidedCenter( + int centerX, + int centerY, + params (int, int)[] sizes) + { + var circularCloudLayouter = Arrange(centerX, centerY); + + var rectangles = GenerateLayout(sizes, circularCloudLayouter); + + Assert_FirstRectangleIsPositionedAtProvidedCenter(rectangles, new Point(centerX, centerY)); + } + + [Test] + [Description("Проверяем, что прямоугольники расположены наиболее плотно, " + + "то есть максимум из попарных расстояний между центрами " + + "прямоугольников не превышает maxDistance")] + [TestCaseSource(nameof(DensityTestSource))] + public void RectanglesShouldBeCloseToEachOther( + int centerX, + int centerY, + int maxDistance, + params (int, int)[] sizes) + { + var circularCloudLayouter = Arrange(centerX, centerY); + + var rectangles = GenerateLayout(sizes, circularCloudLayouter); + Assert_RectanglesArePositionedCloseToEachOther(rectangles, maxDistance); + } + + [Test] + [Description("Проверяем, что общий центр масс всех прямоугольников находится " + + "рядом с центром, переданным в конструктор CircularCloudLayouter")] + [TestCaseSource(nameof(CenterTestSource))] + public void RectanglesCommonBarycenterIsCloseToTheProvidedCenter( + int centerX, + int centerY, + params (int, int)[] sizes) + { + var circularCloudLayouter = Arrange(centerX, centerY); + + var rectangles = GenerateLayout(sizes, circularCloudLayouter); + + Assert_RectanglesBarycenterIsCloseToCenter(rectangles, new Point(centerX, centerY)); + } + + private static CircularCloudLayouter Arrange(int centerX, int centerY) + { + return new CircularCloudLayouter(new Point(centerX, centerY)); + } + + private readonly struct RectanglePair(Rectangle rectangle1, Rectangle rectangle2) + { + public Rectangle Rectangle1 { get; } = rectangle1; + public Rectangle Rectangle2 { get; } = rectangle2; + public bool HasNoIntersections() => !Rectangle1.IntersectsWith(Rectangle2); + + public bool DistanceIsNotGreaterThan(int expectedDistance) + { + var center1 = RectangleCenter(Rectangle1); + var center2 = RectangleCenter(Rectangle2); + var actualDistance = SquaredDistance(center1, center2); + return actualDistance <= expectedDistance; + } + } + + private static Point RectangleCenter(Rectangle rectangle) + { + return new Point((rectangle.X + rectangle.Right) / 2, (rectangle.Y + rectangle.Bottom) / 2); + } + + private static int SquaredDistance(Point p1, Point p2) + { + return (int)(Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y - p2.Y, 2)); + } + + private IEnumerable GenerateLayout( + (int, int)[] sizes, + CircularCloudLayouter circularCloudLayouter) + { + return sizes + .Select(((int w, int h) s) => + circularCloudLayouter.PutNextRectangle(new Size(s.w, s.h))); + } + + private IEnumerable GetAllPossibleRectanglePairs(IEnumerable rectangles) + { + var rectangleList = rectangles.ToList(); + return rectangleList + .SelectMany(rect1 => rectangleList.Select(rect2 => new RectanglePair(rect1, rect2))) + .Where(pair => pair.Rectangle1 != pair.Rectangle2); + } + + private void Assert_RectanglesDoNotIntersect(IEnumerable rectangles) + { + GetAllPossibleRectanglePairs(rectangles) + .Should() + .OnlyContain(pair => pair.HasNoIntersections()); + } + + private void Assert_FirstRectangleIsPositionedAtProvidedCenter(IEnumerable rectangles, Point center) + { + RectangleCenter(rectangles.First()) + .Should() + .BeEquivalentTo(center); + } + + private void Assert_RectanglesArePositionedCloseToEachOther( + IEnumerable rectangles, + int maxDistance) + { + GetAllPossibleRectanglePairs(rectangles) + .Should() + .OnlyContain(pair => pair.DistanceIsNotGreaterThan(maxDistance)); + } + + private void Assert_RectanglesBarycenterIsCloseToCenter( + IEnumerable rectangles, + Point center) + { + var (totalX, totalY, count) = rectangles + .Aggregate((0, 0, 0), ((int totalX, int totalY, int count) res, Rectangle rect) => + { + var rectCenter = RectangleCenter(rect); + return (res.totalX + rectCenter.X, res.totalY + rectCenter.Y, ++res.count); + }); + var barycenter = new Point(totalX / count, totalY / count); + var deviationFromCenter = SquaredDistance(barycenter, center); + deviationFromCenter.Should().BeLessOrEqualTo(100); + } + + private static object[][] IntersectionTestSource() + { + return + [ + [ + 0, 0, + (1, 2), + (3, 4), + (5, 6), + (7, 8) + ], + [ + 0, 0, + (1, 1), + (1, 1), + (2, 2), + (2, 2) + ], + [ + 3, 3, + (1, 2), + (2, 1), + (4, 5), + (6, 5), + (3, 2), + (2, 2) + ] + ]; + } + + private static object[][] FirstRectanglePositionTestSource() + { + return + [ + [ + 0, 0, + (1, 2), + (2, 3), + (4, 5) + ], + [ + 1, 5, + (4, 4), + (3, 3), + (2, 2) + ], + [ + -2, 3, + (3, 3) + ] + ]; + } + + private static object[][] DensityTestSource() + { + return + [ + [ + 0, 0, 25, + (2, 2), + (3, 3), + (4, 4) + ], + [ + 0, 0, 25, + (2, 2), + (4, 4), + (3, 3) + ], + [ + 0, 0, 36, + (4, 4), + (3, 3), + (2, 2), + (1, 1) + ], + [ + 0, 0, 25, + (2, 2), + (3, 3), + (4, 4), + (1, 1) + ] + ]; + } + + private static object[][] CenterTestSource() + { + return + [ + [ + 0, 0, + (2, 2), + (4, 3), + (3, 4), + (2 ,2) + ], + [ + 3, 5, + (4, 1), + (1, 5), + (3, 2), + (4, 3) + ], + [ + 2, 10, + (1, 2), + (2, 3), + (3, 4), + (4, 5), + (5, 4), + (4, 3), + (3, 2), + (2, 1) + ] + ]; } } \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj b/TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj index 96e93e3a0..c5b3bac61 100644 --- a/TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj @@ -7,6 +7,7 @@ + From 1cbb6943fc05c4d9a6283f8d347dd23fe609b8d7 Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Tue, 12 Nov 2024 19:32:47 +0500 Subject: [PATCH 03/19] added fail reporting to tests and changed test cases. Also added exception test --- .../CircularCloudLayouterTest.cs | 263 +++++++++++++----- .../TagsCloudVisualization.Tests.csproj | 1 + 2 files changed, 193 insertions(+), 71 deletions(-) diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs index ef0ef0eba..372ec100b 100644 --- a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs @@ -1,10 +1,12 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Drawing.Imaging; +using System.IO; using System.Linq; using FluentAssertions; using NUnit.Framework; -using TagsCloudVisualization; +using NUnit.Framework.Interfaces; namespace TagsCloudVisualization.Tests; @@ -13,13 +15,91 @@ namespace TagsCloudVisualization.Tests; public class CircularCloudLayouterTest { + private static readonly string failReportFolderPath = "./failed"; + + [OneTimeSetUp] + public void EmptyFailReportFolder() + { + if (Directory.Exists(failReportFolderPath)) + Directory.Delete(failReportFolderPath, true); + } + + [TearDown] + public void ReportFailures() + { + var context = TestContext.CurrentContext; + if (context.Result.Outcome.Status == TestStatus.Failed) + { + var args = context.Test.Arguments; + var center = new Point((int) args[0]!, (int) args[1]!); + var circularCloudLayouter = Arrange(center.X, center.Y); + if (context.Test.MethodName == null) + { + Console.WriteLine("Teardown error: test method name is null"); + return; + } + + if (context.Test.MethodName.Contains(nameof(PutNextRectangle_ThrowsOnHeightOrWidth_BeingLessOrEqualToZero))) + return; + + var isClosenessTest = context.Test.MethodName.Contains(nameof(RectanglesShouldBeCloseToEachOther)); + + var sizesArr = ((int, int)[])(isClosenessTest ? args[3] : args[2]); + + var rectangles = GenerateLayout(sizesArr, circularCloudLayouter); + var savingPath = $"{failReportFolderPath}/{context.Test.Name}.png"; + + Directory.CreateDirectory(failReportFolderPath); + +#pragma warning disable CA1416 + var pen = new Pen(Color.Blue); + var bitmap = new Bitmap(1000, 1000); + var graphics = Graphics.FromImage(bitmap); + graphics.Clear(Color.White); + graphics.DrawRectangles(pen, rectangles.ToArray()); + + var isCenterTest = context.Test.MethodName.Contains(nameof(RectanglesCommonBarycenterIsCloseToTheProvidedCenter)); + if (isCenterTest) + graphics.DrawEllipse(pen, center.X, center.Y, 20, 20); + + bitmap.Save(savingPath, ImageFormat.Png); +#pragma warning restore CA1416 + Console.WriteLine($"Failure was reported to {Path.GetFullPath(savingPath)}"); + } + } + + [Test] + [Description("Проверяем, что метод PutNextRectangle бросает ArgumentException, " + + "если ему передан размер прямоугольника с высотой или шириной " + + "меньше либо равной нулю")] + [TestCase(0, -4, 0, 4)] + [TestCase(0, 1, -2, 4)] + [TestCase(0, 0, 4, -2)] + [TestCase(2, 3, 2, 0)] + [TestCase(1, 2, -2, -1)] + [TestCase(-1, 0, -1, 0)] + public void PutNextRectangle_ThrowsOnHeightOrWidth_BeingLessOrEqualToZero( + int centerX, + int centerY, + int width, + int height) + { + var circularCloudLayouter = Arrange(centerX, centerY); + + Action act = () => circularCloudLayouter.PutNextRectangle(new Size(width, height)); + + act.Should() + .Throw() + .WithMessage("rectangle width and height must be greater than 0"); + } + [Test] [Description("Проверяем, что прямоугольники не пересекаются друг с другом")] [TestCaseSource(nameof(IntersectionTestSource))] public void RectanglesShouldNotIntersectEachOther( int centerX, int centerY, - params (int, int)[] sizes) + (int, int)[] sizes) { var circularCloudLayouter = Arrange(centerX, centerY); @@ -35,7 +115,7 @@ public void RectanglesShouldNotIntersectEachOther( public void FirstRectangleShouldBePositionedAtProvidedCenter( int centerX, int centerY, - params (int, int)[] sizes) + (int, int)[] sizes) { var circularCloudLayouter = Arrange(centerX, centerY); @@ -53,7 +133,7 @@ public void RectanglesShouldBeCloseToEachOther( int centerX, int centerY, int maxDistance, - params (int, int)[] sizes) + (int, int)[] sizes) { var circularCloudLayouter = Arrange(centerX, centerY); @@ -69,7 +149,7 @@ public void RectanglesShouldBeCloseToEachOther( public void RectanglesCommonBarycenterIsCloseToTheProvidedCenter( int centerX, int centerY, - params (int, int)[] sizes) + (int, int)[] sizes) { var circularCloudLayouter = Arrange(centerX, centerY); @@ -121,7 +201,9 @@ private IEnumerable GetAllPossibleRectanglePairs(IEnumerable rectangleList.Select(rect2 => new RectanglePair(rect1, rect2))) + .SelectMany((rect1, index) => rectangleList + .GetRange(index, rectangleList.Count - index) + .Select(rect2 => new RectanglePair(rect1, rect2))) .Where(pair => pair.Rectangle1 != pair.Rectangle2); } @@ -160,7 +242,7 @@ private void Assert_RectanglesBarycenterIsCloseToCenter( }); var barycenter = new Point(totalX / count, totalY / count); var deviationFromCenter = SquaredDistance(barycenter, center); - deviationFromCenter.Should().BeLessOrEqualTo(100); + deviationFromCenter.Should().BeLessOrEqualTo(25); } private static object[][] IntersectionTestSource() @@ -168,27 +250,36 @@ private static object[][] IntersectionTestSource() return [ [ - 0, 0, - (1, 2), - (3, 4), - (5, 6), - (7, 8) + 500, 500, + new[] + { + (20, 10), + (40, 20), + (60, 30), + (80, 40) + } ], [ - 0, 0, - (1, 1), - (1, 1), - (2, 2), - (2, 2) + 500, 500, + new[] + { + (10, 10), + (10, 10), + (20, 10), + (20, 10) + } ], [ - 3, 3, - (1, 2), - (2, 1), - (4, 5), - (6, 5), - (3, 2), - (2, 2) + 600, 600, + new[] + { + (20, 10), + (30, 15), + (50, 10), + (60, 30), + (30, 10), + (40, 20) + } ] ]; } @@ -198,20 +289,29 @@ private static object[][] FirstRectanglePositionTestSource() return [ [ - 0, 0, - (1, 2), - (2, 3), - (4, 5) + 500, 500, + new[] + { + (20, 30), + (30, 45), + (40, 60) + } ], [ - 1, 5, - (4, 4), - (3, 3), - (2, 2) + 510, 550, + new[] + { + (10, 40), + (10, 30), + (10, 20) + } ], [ - -2, 3, - (3, 3) + 300, 800, + new[] + { + (10, 30) + } ] ]; } @@ -221,30 +321,42 @@ private static object[][] DensityTestSource() return [ [ - 0, 0, 25, - (2, 2), - (3, 3), - (4, 4) + 500, 500, 3025, + new[] + { + (20, 20), + (30, 30), + (40, 40) + } ], [ - 0, 0, 25, - (2, 2), - (4, 4), - (3, 3) + 500, 500, 3025, + new[] + { + (20, 20), + (40, 40), + (30, 30) + } ], [ - 0, 0, 36, - (4, 4), - (3, 3), - (2, 2), - (1, 1) + 600, 400, 4225, + new[] + { + (40, 40), + (30, 30), + (20, 20), + (10, 10) + } ], [ - 0, 0, 25, - (2, 2), - (3, 3), - (4, 4), - (1, 1) + 400, 550, 3025, + new[] + { + (20, 20), + (30, 30), + (40, 40), + (10, 10) + } ] ]; } @@ -254,29 +366,38 @@ private static object[][] CenterTestSource() return [ [ - 0, 0, - (2, 2), - (4, 3), - (3, 4), - (2 ,2) + 500, 500, + new[] + { + (10, 20), + (10, 60), + (10, 60), + (10, 20) + } ], [ - 3, 5, - (4, 1), - (1, 5), - (3, 2), - (4, 3) + 300, 500, + new[] + { + (10, 40), + (10, 50), + (20, 30), + (40, 30) + } ], [ - 2, 10, - (1, 2), - (2, 3), - (3, 4), - (4, 5), - (5, 4), - (4, 3), - (3, 2), - (2, 1) + 520, 410, + new[] + { + (10, 20), + (20, 30), + (30, 40), + (40, 50), + (50, 40), + (40, 30), + (30, 20), + (20, 10) + } ] ]; } diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj b/TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj index c5b3bac61..a41c7bb2f 100644 --- a/TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/TagsCloudVisualization.Tests.csproj @@ -11,6 +11,7 @@ + From 4b6885a326f33d4d1f129a0b28ddb93eba30ad4a Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Tue, 12 Nov 2024 19:35:34 +0500 Subject: [PATCH 04/19] v1.0 - WIP --- .../CircularCloudLayouter.cs | 117 +++++++++++++++++- .../TagsCloudVisualization.csproj | 4 + 2 files changed, 119 insertions(+), 2 deletions(-) diff --git a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs index 1fbadaae1..275778dd7 100644 --- a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs +++ b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs @@ -4,13 +4,126 @@ namespace TagsCloudVisualization; public class CircularCloudLayouter { + private List generatedLayout = new(); + private Point cloudCenter; + private double nextAngle; + + private static readonly double angleStep = Math.PI / 8; + private static readonly double tracingStep = 1; + public CircularCloudLayouter(Point center) { - + cloudCenter = center; } public Rectangle PutNextRectangle(Size rectangleSize) { - throw new NotImplementedException(); + if (rectangleSize.Width <= 0 || rectangleSize.Height <= 0) + throw new ArgumentException("rectangle width and height must be greater than 0"); + + if (generatedLayout.Count == 0) + { + var rectangle = new Rectangle( + cloudCenter.X - rectangleSize.Width / 2, + cloudCenter.Y - rectangleSize.Height / 2, + rectangleSize.Width, + rectangleSize.Height); + generatedLayout.Add(rectangle); + return rectangle; + } + + Rectangle? result = null; + while (!result.HasValue) + { + var nextPos = GetNextPosition(); + var (hitRect, hitPoint) = TraceLineToCenter(nextPos); + result = TryPlaceRectangleNearHitPoint(rectangleSize, hitRect, hitPoint); + } + + generatedLayout.Add(result.Value); + return result.Value; + } + + private Rectangle? TryPlaceRectangleNearHitPoint(Size rectangleSize, Rectangle hitRectangle, PointF hitPoint) + { + var differences = new PointF[] + { + new PointF(hitRectangle.X - hitPoint.X, hitRectangle.Y - hitPoint.Y), + new PointF(hitRectangle.Right - hitPoint.X, hitRectangle.Y - hitPoint.Y), + new PointF(hitRectangle.X - hitPoint.X, hitRectangle.Bottom - hitPoint.Y), + new PointF(hitRectangle.Right - hitPoint.X, hitRectangle.Bottom - hitPoint.Y), + }; + var min = differences.MinBy(point => Math.Pow(point.X, 2) + Math.Pow(point.Y, 2)); + var posToPlace = Point.Truncate(new PointF(hitPoint.X + min.X, hitPoint.Y + min.Y)); + + return TryFindGoodRectanglePosition(posToPlace, rectangleSize); + } + + private Rectangle? TryFindGoodRectanglePosition(Point posToPlace, Size rectangleSize) + { + var possibleOptions = new Rectangle?[] + { + new Rectangle( + posToPlace.X, + posToPlace.Y, + rectangleSize.Width, + rectangleSize.Height), + new Rectangle( + posToPlace.X - rectangleSize.Width, + posToPlace.Y, + rectangleSize.Width, + rectangleSize.Height), + new Rectangle( + posToPlace.X, + posToPlace.Y - rectangleSize.Height, + rectangleSize.Width, + rectangleSize.Height), + new Rectangle( + posToPlace.X - rectangleSize.Width, + posToPlace.Y - rectangleSize.Height, + rectangleSize.Width, + rectangleSize.Height) + }; + + Rectangle? best = possibleOptions + .FirstOrDefault(rect => generatedLayout + .All(generatedRect => !rect?.IntersectsWith(generatedRect) ?? false), + null); + + return best; + } + + private (Rectangle, PointF) TraceLineToCenter(PointF from) + { + var difference = new PointF(cloudCenter.X - from.X, cloudCenter.Y - from.Y); + var currentStep = 0.1d; + while (currentStep < 1.0d) + { + var tracingPos = new PointF( + (float)(from.X + difference.X * currentStep), + (float)(from.Y + difference.Y * currentStep)); + foreach (var rect in generatedLayout) + { + if (rect.Contains(Point.Truncate(tracingPos))) + return (rect, tracingPos); + } + currentStep += 0.1; + } + + return (generatedLayout[0], cloudCenter); + } + + private PointF GetNextPosition() + { + //var radius = 500d / (2 * Math.PI) * nextAngle; + var x = (float)(500d * Math.Cos(nextAngle) + cloudCenter.X); + var y = (float)(500d * Math.Sin(nextAngle) + cloudCenter.Y); + + nextAngle *= -1; + if (nextAngle < 0) + nextAngle -= angleStep; + else + nextAngle += angleStep; + return new PointF(x, y); } } \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization/TagsCloudVisualization.csproj b/TagsCloudVisualization/TagsCloudVisualization/TagsCloudVisualization.csproj index 2f4fc7765..f4aff6610 100644 --- a/TagsCloudVisualization/TagsCloudVisualization/TagsCloudVisualization.csproj +++ b/TagsCloudVisualization/TagsCloudVisualization/TagsCloudVisualization.csproj @@ -7,4 +7,8 @@ enable + + + + From c7b924fc5ce5435afd03c698b86bd2ca4ebc7ff4 Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Tue, 12 Nov 2024 22:00:24 +0500 Subject: [PATCH 05/19] CircularCloudLayouter v2.0 and modified barycenter test to be more realistic --- .../CircularCloudLayouterTest.cs | 29 +++++-- .../CircularCloudLayouter.cs | 83 ++++++++----------- 2 files changed, 56 insertions(+), 56 deletions(-) diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs index 372ec100b..c282f2494 100644 --- a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs @@ -16,6 +16,7 @@ public class CircularCloudLayouterTest { private static readonly string failReportFolderPath = "./failed"; + private static readonly int maxDistanceFromBarycenter = 20; [OneTimeSetUp] public void EmptyFailReportFolder() @@ -46,21 +47,26 @@ public void ReportFailures() var sizesArr = ((int, int)[])(isClosenessTest ? args[3] : args[2]); - var rectangles = GenerateLayout(sizesArr, circularCloudLayouter); + var rectangles = GenerateLayout(sizesArr, circularCloudLayouter).ToArray(); var savingPath = $"{failReportFolderPath}/{context.Test.Name}.png"; Directory.CreateDirectory(failReportFolderPath); #pragma warning disable CA1416 - var pen = new Pen(Color.Blue); var bitmap = new Bitmap(1000, 1000); var graphics = Graphics.FromImage(bitmap); graphics.Clear(Color.White); - graphics.DrawRectangles(pen, rectangles.ToArray()); + graphics.DrawRectangles(new Pen(Color.Blue), rectangles); var isCenterTest = context.Test.MethodName.Contains(nameof(RectanglesCommonBarycenterIsCloseToTheProvidedCenter)); if (isCenterTest) - graphics.DrawEllipse(pen, center.X, center.Y, 20, 20); + { + graphics.DrawEllipse( + new Pen(Color.Lime), center.X, center.Y, + maxDistanceFromBarycenter, maxDistanceFromBarycenter); + var barycenter = ComputeBaryCenter(rectangles); + graphics.DrawEllipse(new Pen(Color.Red), barycenter.X, barycenter.Y, 1, 1); + } bitmap.Save(savingPath, ImageFormat.Png); #pragma warning restore CA1416 @@ -230,9 +236,7 @@ private void Assert_RectanglesArePositionedCloseToEachOther( .OnlyContain(pair => pair.DistanceIsNotGreaterThan(maxDistance)); } - private void Assert_RectanglesBarycenterIsCloseToCenter( - IEnumerable rectangles, - Point center) + private Point ComputeBaryCenter(IEnumerable rectangles) { var (totalX, totalY, count) = rectangles .Aggregate((0, 0, 0), ((int totalX, int totalY, int count) res, Rectangle rect) => @@ -240,9 +244,16 @@ private void Assert_RectanglesBarycenterIsCloseToCenter( var rectCenter = RectangleCenter(rect); return (res.totalX + rectCenter.X, res.totalY + rectCenter.Y, ++res.count); }); - var barycenter = new Point(totalX / count, totalY / count); + return new Point(totalX / count, totalY / count); + } + + private void Assert_RectanglesBarycenterIsCloseToCenter( + IEnumerable rectangles, + Point center) + { + var barycenter = ComputeBaryCenter(rectangles); var deviationFromCenter = SquaredDistance(barycenter, center); - deviationFromCenter.Should().BeLessOrEqualTo(25); + deviationFromCenter.Should().BeLessOrEqualTo(maxDistanceFromBarycenter * maxDistanceFromBarycenter); } private static object[][] IntersectionTestSource() diff --git a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs index 275778dd7..e16cfe1b6 100644 --- a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs +++ b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs @@ -8,8 +8,9 @@ public class CircularCloudLayouter private Point cloudCenter; private double nextAngle; - private static readonly double angleStep = Math.PI / 8; - private static readonly double tracingStep = 1; + private static readonly double angleStep = Math.PI / 2; + private static readonly float tracingStep = 0.01f; + private static readonly float maxTracingDistance = 500f; public CircularCloudLayouter(Point center) { @@ -32,31 +33,26 @@ public Rectangle PutNextRectangle(Size rectangleSize) return rectangle; } - Rectangle? result = null; - while (!result.HasValue) - { - var nextPos = GetNextPosition(); - var (hitRect, hitPoint) = TraceLineToCenter(nextPos); - result = TryPlaceRectangleNearHitPoint(rectangleSize, hitRect, hitPoint); - } - - generatedLayout.Add(result.Value); - return result.Value; + var nextRectangle = GetNextRectangle(rectangleSize); + generatedLayout.Add(nextRectangle); + return nextRectangle; } - private Rectangle? TryPlaceRectangleNearHitPoint(Size rectangleSize, Rectangle hitRectangle, PointF hitPoint) + private Rectangle GetNextRectangle(Size rectangleSize) { - var differences = new PointF[] + Rectangle? result = null; + while (result == null) { - new PointF(hitRectangle.X - hitPoint.X, hitRectangle.Y - hitPoint.Y), - new PointF(hitRectangle.Right - hitPoint.X, hitRectangle.Y - hitPoint.Y), - new PointF(hitRectangle.X - hitPoint.X, hitRectangle.Bottom - hitPoint.Y), - new PointF(hitRectangle.Right - hitPoint.X, hitRectangle.Bottom - hitPoint.Y), - }; - var min = differences.MinBy(point => Math.Pow(point.X, 2) + Math.Pow(point.Y, 2)); - var posToPlace = Point.Truncate(new PointF(hitPoint.X + min.X, hitPoint.Y + min.Y)); + var direction = GetNextDirection(); + var step = 0.0f; + while (step < 1f && result == null) + { + (step, var availablePos) = FindNextAvailablePosByTracingLine(direction, step); + result = TryFindGoodRectanglePosition(availablePos, rectangleSize); + } + } - return TryFindGoodRectanglePosition(posToPlace, rectangleSize); + return result.Value; } private Rectangle? TryFindGoodRectanglePosition(Point posToPlace, Size rectangleSize) @@ -93,37 +89,30 @@ public Rectangle PutNextRectangle(Size rectangleSize) return best; } - private (Rectangle, PointF) TraceLineToCenter(PointF from) + private (float, Point) FindNextAvailablePosByTracingLine(PointF direction, float startingStep = 0.0f) { - var difference = new PointF(cloudCenter.X - from.X, cloudCenter.Y - from.Y); - var currentStep = 0.1d; - while (currentStep < 1.0d) + var nextPos = new PointF( + cloudCenter.X + direction.X * tracingStep, + cloudCenter.Y + direction.Y * tracingStep); + var currentStep = startingStep == 0.0f ? tracingStep : startingStep; + var notInRectangle = false; + while (!notInRectangle) { - var tracingPos = new PointF( - (float)(from.X + difference.X * currentStep), - (float)(from.Y + difference.Y * currentStep)); - foreach (var rect in generatedLayout) - { - if (rect.Contains(Point.Truncate(tracingPos))) - return (rect, tracingPos); - } - currentStep += 0.1; + notInRectangle = generatedLayout.All(rect => !rect.Contains(Point.Truncate(nextPos))); + currentStep += tracingStep; + nextPos = new PointF( + cloudCenter.X + direction.X * currentStep, + cloudCenter.Y + direction.Y * currentStep); } - - return (generatedLayout[0], cloudCenter); + + return (currentStep, Point.Truncate(nextPos)); } - private PointF GetNextPosition() + private PointF GetNextDirection() { - //var radius = 500d / (2 * Math.PI) * nextAngle; - var x = (float)(500d * Math.Cos(nextAngle) + cloudCenter.X); - var y = (float)(500d * Math.Sin(nextAngle) + cloudCenter.Y); - - nextAngle *= -1; - if (nextAngle < 0) - nextAngle -= angleStep; - else - nextAngle += angleStep; + var x = (float)Math.Cos(nextAngle); + var y = (float)Math.Sin(nextAngle); + nextAngle += angleStep; return new PointF(x, y); } } \ No newline at end of file From 4f0716cd8066b198acf09e4a27a831b0824b1b04 Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 15:37:51 +0500 Subject: [PATCH 06/19] renaming --- ...t.cs => CircularCloudLayouterImplTests.cs} | 63 ++----- .../CircularCloudLayouter.cs | 118 ------------- .../CircularCloudLayouterImpl.cs | 163 ++++++++++++++++++ 3 files changed, 178 insertions(+), 166 deletions(-) rename TagsCloudVisualization/TagsCloudVisualization.Tests/{CircularCloudLayouterTest.cs => CircularCloudLayouterImplTests.cs} (83%) delete mode 100644 TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs create mode 100644 TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterImplTests.cs similarity index 83% rename from TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs rename to TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterImplTests.cs index c282f2494..c411da297 100644 --- a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTest.cs +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterImplTests.cs @@ -11,8 +11,8 @@ namespace TagsCloudVisualization.Tests; [TestFixture] -[TestOf(typeof(CircularCloudLayouter))] -public class CircularCloudLayouterTest +[TestOf(typeof(CircularCloudLayouterImpl))] +public class CircularCloudLayouterImplTest { private static readonly string failReportFolderPath = "./failed"; @@ -164,65 +164,32 @@ public void RectanglesCommonBarycenterIsCloseToTheProvidedCenter( Assert_RectanglesBarycenterIsCloseToCenter(rectangles, new Point(centerX, centerY)); } - private static CircularCloudLayouter Arrange(int centerX, int centerY) + private static CircularCloudLayouterImpl Arrange(int centerX, int centerY) { - return new CircularCloudLayouter(new Point(centerX, centerY)); - } - - private readonly struct RectanglePair(Rectangle rectangle1, Rectangle rectangle2) - { - public Rectangle Rectangle1 { get; } = rectangle1; - public Rectangle Rectangle2 { get; } = rectangle2; - public bool HasNoIntersections() => !Rectangle1.IntersectsWith(Rectangle2); - - public bool DistanceIsNotGreaterThan(int expectedDistance) - { - var center1 = RectangleCenter(Rectangle1); - var center2 = RectangleCenter(Rectangle2); - var actualDistance = SquaredDistance(center1, center2); - return actualDistance <= expectedDistance; - } - } - - private static Point RectangleCenter(Rectangle rectangle) - { - return new Point((rectangle.X + rectangle.Right) / 2, (rectangle.Y + rectangle.Bottom) / 2); - } - - private static int SquaredDistance(Point p1, Point p2) - { - return (int)(Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y - p2.Y, 2)); + return new CircularCloudLayouterImpl(new Point(centerX, centerY)); } private IEnumerable GenerateLayout( (int, int)[] sizes, - CircularCloudLayouter circularCloudLayouter) + CircularCloudLayouterImpl circularCloudLayouterImpl) { return sizes .Select(((int w, int h) s) => - circularCloudLayouter.PutNextRectangle(new Size(s.w, s.h))); - } - - private IEnumerable GetAllPossibleRectanglePairs(IEnumerable rectangles) - { - var rectangleList = rectangles.ToList(); - return rectangleList - .SelectMany((rect1, index) => rectangleList - .GetRange(index, rectangleList.Count - index) - .Select(rect2 => new RectanglePair(rect1, rect2))) - .Where(pair => pair.Rectangle1 != pair.Rectangle2); + circularCloudLayouterImpl.PutNextRectangle(new Size(s.w, s.h))); } private void Assert_RectanglesDoNotIntersect(IEnumerable rectangles) { - GetAllPossibleRectanglePairs(rectangles) + rectangles.CheckForAllPairs(pair => !pair.Item1.IntersectsWith(pair.Item2)) .Should() - .OnlyContain(pair => pair.HasNoIntersections()); + .BeTrue(); } private void Assert_FirstRectangleIsPositionedAtProvidedCenter(IEnumerable rectangles, Point center) { - RectangleCenter(rectangles.First()) + rectangles + .First() + .RectangleCenter() .Should() .BeEquivalentTo(center); } @@ -231,9 +198,9 @@ private void Assert_RectanglesArePositionedCloseToEachOther( IEnumerable rectangles, int maxDistance) { - GetAllPossibleRectanglePairs(rectangles) + rectangles.CheckForAllPairs(pair => pair.Item1.DistanceToOtherIsNotGreaterThan(pair.Item2, maxDistance)) .Should() - .OnlyContain(pair => pair.DistanceIsNotGreaterThan(maxDistance)); + .BeTrue(); } private Point ComputeBaryCenter(IEnumerable rectangles) @@ -241,7 +208,7 @@ private Point ComputeBaryCenter(IEnumerable rectangles) var (totalX, totalY, count) = rectangles .Aggregate((0, 0, 0), ((int totalX, int totalY, int count) res, Rectangle rect) => { - var rectCenter = RectangleCenter(rect); + var rectCenter = rect.RectangleCenter(); return (res.totalX + rectCenter.X, res.totalY + rectCenter.Y, ++res.count); }); return new Point(totalX / count, totalY / count); @@ -252,7 +219,7 @@ private void Assert_RectanglesBarycenterIsCloseToCenter( Point center) { var barycenter = ComputeBaryCenter(rectangles); - var deviationFromCenter = SquaredDistance(barycenter, center); + var deviationFromCenter = barycenter.SquaredDistanceTo(center); deviationFromCenter.Should().BeLessOrEqualTo(maxDistanceFromBarycenter * maxDistanceFromBarycenter); } diff --git a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs deleted file mode 100644 index e16cfe1b6..000000000 --- a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouter.cs +++ /dev/null @@ -1,118 +0,0 @@ -using System.Drawing; - -namespace TagsCloudVisualization; - -public class CircularCloudLayouter -{ - private List generatedLayout = new(); - private Point cloudCenter; - private double nextAngle; - - private static readonly double angleStep = Math.PI / 2; - private static readonly float tracingStep = 0.01f; - private static readonly float maxTracingDistance = 500f; - - public CircularCloudLayouter(Point center) - { - cloudCenter = center; - } - - public Rectangle PutNextRectangle(Size rectangleSize) - { - if (rectangleSize.Width <= 0 || rectangleSize.Height <= 0) - throw new ArgumentException("rectangle width and height must be greater than 0"); - - if (generatedLayout.Count == 0) - { - var rectangle = new Rectangle( - cloudCenter.X - rectangleSize.Width / 2, - cloudCenter.Y - rectangleSize.Height / 2, - rectangleSize.Width, - rectangleSize.Height); - generatedLayout.Add(rectangle); - return rectangle; - } - - var nextRectangle = GetNextRectangle(rectangleSize); - generatedLayout.Add(nextRectangle); - return nextRectangle; - } - - private Rectangle GetNextRectangle(Size rectangleSize) - { - Rectangle? result = null; - while (result == null) - { - var direction = GetNextDirection(); - var step = 0.0f; - while (step < 1f && result == null) - { - (step, var availablePos) = FindNextAvailablePosByTracingLine(direction, step); - result = TryFindGoodRectanglePosition(availablePos, rectangleSize); - } - } - - return result.Value; - } - - private Rectangle? TryFindGoodRectanglePosition(Point posToPlace, Size rectangleSize) - { - var possibleOptions = new Rectangle?[] - { - new Rectangle( - posToPlace.X, - posToPlace.Y, - rectangleSize.Width, - rectangleSize.Height), - new Rectangle( - posToPlace.X - rectangleSize.Width, - posToPlace.Y, - rectangleSize.Width, - rectangleSize.Height), - new Rectangle( - posToPlace.X, - posToPlace.Y - rectangleSize.Height, - rectangleSize.Width, - rectangleSize.Height), - new Rectangle( - posToPlace.X - rectangleSize.Width, - posToPlace.Y - rectangleSize.Height, - rectangleSize.Width, - rectangleSize.Height) - }; - - Rectangle? best = possibleOptions - .FirstOrDefault(rect => generatedLayout - .All(generatedRect => !rect?.IntersectsWith(generatedRect) ?? false), - null); - - return best; - } - - private (float, Point) FindNextAvailablePosByTracingLine(PointF direction, float startingStep = 0.0f) - { - var nextPos = new PointF( - cloudCenter.X + direction.X * tracingStep, - cloudCenter.Y + direction.Y * tracingStep); - var currentStep = startingStep == 0.0f ? tracingStep : startingStep; - var notInRectangle = false; - while (!notInRectangle) - { - notInRectangle = generatedLayout.All(rect => !rect.Contains(Point.Truncate(nextPos))); - currentStep += tracingStep; - nextPos = new PointF( - cloudCenter.X + direction.X * currentStep, - cloudCenter.Y + direction.Y * currentStep); - } - - return (currentStep, Point.Truncate(nextPos)); - } - - private PointF GetNextDirection() - { - var x = (float)Math.Cos(nextAngle); - var y = (float)Math.Sin(nextAngle); - nextAngle += angleStep; - return new PointF(x, y); - } -} \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs new file mode 100644 index 000000000..0bf8e8a9c --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs @@ -0,0 +1,163 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public class CircularCloudLayouter +{ + + private static readonly float TracingStep = 0.01f; + private static readonly float MaxTracingDistance = 1000f; + private static readonly int MaxCycleCount = 6; + + private List _generatedLayout = new(); + private readonly Point _cloudCenter; + private double _nextAngle; + private double _angleStep = Math.PI / 2; + private int _currentCycle; + private int CurrentCycle + { + get => _currentCycle; + set + { + ArgumentOutOfRangeException.ThrowIfNegative(value); + if (value < MaxCycleCount) + { + _currentCycle = value; + _angleStep = Math.PI / Math.Pow(2, value); + } + } + } + + public CircularCloudLayouter(Point center) + { + _cloudCenter = center; + } + + public Rectangle PutNextRectangle(Size rectangleSize) + { + if (rectangleSize.Width <= 0 || rectangleSize.Height <= 0) + throw new ArgumentException("rectangle width and height must be greater than 0"); + + if (_generatedLayout.Count == 0) + { + var rectangle = new Rectangle( + _cloudCenter.X - rectangleSize.Width / 2, + _cloudCenter.Y - rectangleSize.Height / 2, + rectangleSize.Width, + rectangleSize.Height); + _generatedLayout.Add(rectangle); + return rectangle; + } + + var nextRectangle = GetNextRectangle(rectangleSize); + _generatedLayout.Add(nextRectangle); + return nextRectangle; + } + + private Rectangle GetNextRectangle(Size rectangleSize) + { + Rectangle result = Rectangle.Empty; + var found = false; + while (!found) + { + var direction = GetNextDirection(); + var step = 0.0f; + while (step < 1f && !found) + { + (step, var availablePos) = FindNextAvailablePosByTracingLine(direction, step); + found = TryFindGoodRectanglePosition(availablePos, rectangleSize, out result); + } + } + + return result; + } + + private bool TryFindGoodRectanglePosition(Point posToPlace, Size rectangleSize, out Rectangle result) + { + var possibleOptions = new Rectangle[] + { + new Rectangle( + posToPlace.X, + posToPlace.Y, + rectangleSize.Width, + rectangleSize.Height), + new Rectangle( + posToPlace.X - rectangleSize.Width, + posToPlace.Y, + rectangleSize.Width, + rectangleSize.Height), + new Rectangle( + posToPlace.X, + posToPlace.Y - rectangleSize.Height, + rectangleSize.Width, + rectangleSize.Height), + new Rectangle( + posToPlace.X - rectangleSize.Width, + posToPlace.Y - rectangleSize.Height, + rectangleSize.Width, + rectangleSize.Height) + }; + + foreach (var option in possibleOptions) + { + bool intersects = false; + foreach (var rectangle in _generatedLayout) + { + if (rectangle.IntersectsWith(option)) + { + intersects = true; + break; + } + } + + if (!intersects) + { + result = option; + return true; + } + } + + result = Rectangle.Empty; + return false; + } + + private (float, Point) FindNextAvailablePosByTracingLine(PointF direction, float startingStep = 0.0f) + { + var nextPos = new PointF( + _cloudCenter.X + direction.X * MaxTracingDistance * TracingStep, + _cloudCenter.Y + direction.Y * MaxTracingDistance * TracingStep); + var currentStep = startingStep == 0.0f ? TracingStep : startingStep; + var notInRectangle = false; + while (!notInRectangle) + { + notInRectangle = true; + foreach (var rectangle in _generatedLayout) + { + if (rectangle.ContainsFloat(nextPos)) + { + notInRectangle = false; + break; + } + } + currentStep += TracingStep; + nextPos = new PointF( + _cloudCenter.X + direction.X * MaxTracingDistance * currentStep, + _cloudCenter.Y + direction.Y * MaxTracingDistance * currentStep); + } + + return (currentStep, Point.Truncate(nextPos)); + } + + private PointF GetNextDirection() + { + var x = (float)Math.Cos(_nextAngle); + var y = (float)Math.Sin(_nextAngle); + _nextAngle += _angleStep; + if (Math.Abs(_nextAngle - Math.PI * 2) < 1e-12f) + { + _nextAngle = 0; + CurrentCycle++; + } + return new PointF(x, y); + } +} \ No newline at end of file From 2eb9f9d67867a1abbfe5dfb09d3e159173a945e5 Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 15:39:01 +0500 Subject: [PATCH 07/19] added interface for circular cloud layouter --- .../TagsCloudVisualization/ICircularCloudLayouter.cs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 TagsCloudVisualization/TagsCloudVisualization/ICircularCloudLayouter.cs diff --git a/TagsCloudVisualization/TagsCloudVisualization/ICircularCloudLayouter.cs b/TagsCloudVisualization/TagsCloudVisualization/ICircularCloudLayouter.cs new file mode 100644 index 000000000..2e31f9809 --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization/ICircularCloudLayouter.cs @@ -0,0 +1,9 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public interface ICircularCloudLayouter +{ + public Rectangle PutNextRectangle(Size rectangleSize); + public Point CloudCenter { get; set; } +} \ No newline at end of file From b5e37e55301224f8df975669dea699df336042f7 Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 16:03:38 +0500 Subject: [PATCH 08/19] circularCloudLayouter implementation v3.0 --- .../CircularCloudLayouterImpl.cs | 38 ++++++++++++------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs index 0bf8e8a9c..8b6f24b39 100644 --- a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs +++ b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs @@ -2,15 +2,27 @@ namespace TagsCloudVisualization; -public class CircularCloudLayouter +public class CircularCloudLayouterImpl : ICircularCloudLayouter { - private static readonly float TracingStep = 0.01f; private static readonly float MaxTracingDistance = 1000f; private static readonly int MaxCycleCount = 6; + + public Point CloudCenter + { + get => _cloudCenter; + set + { + if (_generatedLayout.Count > 0) + { + throw new InvalidOperationException("Can not change cloud center after generation start"); + } + _cloudCenter = value; + } + } + private Point _cloudCenter; private List _generatedLayout = new(); - private readonly Point _cloudCenter; private double _nextAngle; private double _angleStep = Math.PI / 2; private int _currentCycle; @@ -28,21 +40,21 @@ private int CurrentCycle } } - public CircularCloudLayouter(Point center) + public CircularCloudLayouterImpl(Point center) { - _cloudCenter = center; + CloudCenter = center; } public Rectangle PutNextRectangle(Size rectangleSize) { - if (rectangleSize.Width <= 0 || rectangleSize.Height <= 0) - throw new ArgumentException("rectangle width and height must be greater than 0"); + ArgumentOutOfRangeException.ThrowIfNegativeOrZero(rectangleSize.Width, "Width"); + ArgumentOutOfRangeException.ThrowIfNegativeOrZero(rectangleSize.Height, "Height"); if (_generatedLayout.Count == 0) { var rectangle = new Rectangle( - _cloudCenter.X - rectangleSize.Width / 2, - _cloudCenter.Y - rectangleSize.Height / 2, + CloudCenter.X - rectangleSize.Width / 2, + CloudCenter.Y - rectangleSize.Height / 2, rectangleSize.Width, rectangleSize.Height); _generatedLayout.Add(rectangle); @@ -124,8 +136,8 @@ private bool TryFindGoodRectanglePosition(Point posToPlace, Size rectangleSize, private (float, Point) FindNextAvailablePosByTracingLine(PointF direction, float startingStep = 0.0f) { var nextPos = new PointF( - _cloudCenter.X + direction.X * MaxTracingDistance * TracingStep, - _cloudCenter.Y + direction.Y * MaxTracingDistance * TracingStep); + CloudCenter.X + direction.X * MaxTracingDistance * TracingStep, + CloudCenter.Y + direction.Y * MaxTracingDistance * TracingStep); var currentStep = startingStep == 0.0f ? TracingStep : startingStep; var notInRectangle = false; while (!notInRectangle) @@ -141,8 +153,8 @@ private bool TryFindGoodRectanglePosition(Point posToPlace, Size rectangleSize, } currentStep += TracingStep; nextPos = new PointF( - _cloudCenter.X + direction.X * MaxTracingDistance * currentStep, - _cloudCenter.Y + direction.Y * MaxTracingDistance * currentStep); + CloudCenter.X + direction.X * MaxTracingDistance * currentStep, + CloudCenter.Y + direction.Y * MaxTracingDistance * currentStep); } return (currentStep, Point.Truncate(nextPos)); From 4677fc5d69e8552a0db3201ac83752c542cf20c4 Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 16:08:11 +0500 Subject: [PATCH 09/19] added extension methods --- .../TagsCloudVisualization/PointExtensions.cs | 11 ++++++++ .../RectangleCollectionExtensions.cs | 19 +++++++++++++ .../RectangleExtensions.cs | 27 +++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 TagsCloudVisualization/TagsCloudVisualization/PointExtensions.cs create mode 100644 TagsCloudVisualization/TagsCloudVisualization/RectangleCollectionExtensions.cs create mode 100644 TagsCloudVisualization/TagsCloudVisualization/RectangleExtensions.cs diff --git a/TagsCloudVisualization/TagsCloudVisualization/PointExtensions.cs b/TagsCloudVisualization/TagsCloudVisualization/PointExtensions.cs new file mode 100644 index 000000000..dc13cf699 --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization/PointExtensions.cs @@ -0,0 +1,11 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public static class PointExtensions +{ + public static int SquaredDistanceTo(this Point p1, Point p2) + { + return (int)(Math.Pow(p1.X - p2.X, 2) + Math.Pow(p1.Y - p2.Y, 2)); + } +} \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization/RectangleCollectionExtensions.cs b/TagsCloudVisualization/TagsCloudVisualization/RectangleCollectionExtensions.cs new file mode 100644 index 000000000..b0a04ffe2 --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization/RectangleCollectionExtensions.cs @@ -0,0 +1,19 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public static class RectangleCollectionExtensions +{ + public static bool CheckForAllPairs( + this IEnumerable rectangles, + Func<(Rectangle, Rectangle), bool> predicate) + { + var rectangleList = rectangles.ToList(); + return rectangleList + .SelectMany((rect1, index) => rectangleList + .GetRange(index, rectangleList.Count - index) + .Select(rect2 => (rect1, rect2))) + .Where(tuple => tuple.Item1 != tuple.Item2) + .All(predicate); + } +} \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization/RectangleExtensions.cs b/TagsCloudVisualization/TagsCloudVisualization/RectangleExtensions.cs new file mode 100644 index 000000000..fe1628897 --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization/RectangleExtensions.cs @@ -0,0 +1,27 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public static class RectangleExtensions +{ + public static bool ContainsFloat(this Rectangle rectangle, PointF point) + { + return rectangle.X <= point.X + && point.X < rectangle.Right + && rectangle.Y <= point.Y + && point.Y < rectangle.Bottom; + } + + public static bool DistanceToOtherIsNotGreaterThan(this Rectangle rect, Rectangle other, int distance) + { + var center1 = RectangleCenter(rect); + var center2 = RectangleCenter(other); + var actualDistance = center1.SquaredDistanceTo(center2); + return actualDistance <= distance; + } + + public static Point RectangleCenter(this Rectangle rectangle) + { + return new Point((rectangle.X + rectangle.Right) / 2, (rectangle.Y + rectangle.Bottom) / 2); + } +} \ No newline at end of file From d23cae3795e1202b48911119b5a6e915c96de4de Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 16:45:50 +0500 Subject: [PATCH 10/19] renaming --- ...Tests.cs => CircularCloudLayouterTests.cs} | 58 ++++++++++--------- 1 file changed, 32 insertions(+), 26 deletions(-) rename TagsCloudVisualization/TagsCloudVisualization.Tests/{CircularCloudLayouterImplTests.cs => CircularCloudLayouterTests.cs} (85%) diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterImplTests.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs similarity index 85% rename from TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterImplTests.cs rename to TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs index c411da297..1fa891ba8 100644 --- a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterImplTests.cs +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs @@ -12,17 +12,25 @@ namespace TagsCloudVisualization.Tests; [TestFixture] [TestOf(typeof(CircularCloudLayouterImpl))] -public class CircularCloudLayouterImplTest +public class CircularCloudLayouterImplTests { - private static readonly string failReportFolderPath = "./failed"; - private static readonly int maxDistanceFromBarycenter = 20; + private static readonly string FailReportFolderPath = "./failed"; + private static readonly int MaxDistanceFromBarycenter = 20; + + private ICircularCloudLayouter _circularCloudLayouter; + + [SetUp] + public void SetUp() + { + _circularCloudLayouter = new CircularCloudLayouterImpl(Point.Empty); + } [OneTimeSetUp] public void EmptyFailReportFolder() { - if (Directory.Exists(failReportFolderPath)) - Directory.Delete(failReportFolderPath, true); + if (Directory.Exists(FailReportFolderPath)) + Directory.Delete(FailReportFolderPath, true); } [TearDown] @@ -33,7 +41,6 @@ public void ReportFailures() { var args = context.Test.Arguments; var center = new Point((int) args[0]!, (int) args[1]!); - var circularCloudLayouter = Arrange(center.X, center.Y); if (context.Test.MethodName == null) { Console.WriteLine("Teardown error: test method name is null"); @@ -47,10 +54,10 @@ public void ReportFailures() var sizesArr = ((int, int)[])(isClosenessTest ? args[3] : args[2]); - var rectangles = GenerateLayout(sizesArr, circularCloudLayouter).ToArray(); - var savingPath = $"{failReportFolderPath}/{context.Test.Name}.png"; + var rectangles = GenerateLayout(sizesArr, _circularCloudLayouter).ToArray(); + var savingPath = $"{FailReportFolderPath}/{context.Test.Name}.png"; - Directory.CreateDirectory(failReportFolderPath); + Directory.CreateDirectory(FailReportFolderPath); #pragma warning disable CA1416 var bitmap = new Bitmap(1000, 1000); @@ -63,7 +70,7 @@ public void ReportFailures() { graphics.DrawEllipse( new Pen(Color.Lime), center.X, center.Y, - maxDistanceFromBarycenter, maxDistanceFromBarycenter); + MaxDistanceFromBarycenter, MaxDistanceFromBarycenter); var barycenter = ComputeBaryCenter(rectangles); graphics.DrawEllipse(new Pen(Color.Red), barycenter.X, barycenter.Y, 1, 1); } @@ -90,13 +97,12 @@ public void PutNextRectangle_ThrowsOnHeightOrWidth_BeingLessOrEqualToZero( int width, int height) { - var circularCloudLayouter = Arrange(centerX, centerY); + Arrange(centerX, centerY); - Action act = () => circularCloudLayouter.PutNextRectangle(new Size(width, height)); + Action act = () => _circularCloudLayouter.PutNextRectangle(new Size(width, height)); act.Should() - .Throw() - .WithMessage("rectangle width and height must be greater than 0"); + .Throw(); } [Test] @@ -107,9 +113,9 @@ public void RectanglesShouldNotIntersectEachOther( int centerY, (int, int)[] sizes) { - var circularCloudLayouter = Arrange(centerX, centerY); + Arrange(centerX, centerY); - var rectangles = GenerateLayout(sizes, circularCloudLayouter); + var rectangles = GenerateLayout(sizes, _circularCloudLayouter); Assert_RectanglesDoNotIntersect(rectangles); } @@ -123,9 +129,9 @@ public void FirstRectangleShouldBePositionedAtProvidedCenter( int centerY, (int, int)[] sizes) { - var circularCloudLayouter = Arrange(centerX, centerY); + Arrange(centerX, centerY); - var rectangles = GenerateLayout(sizes, circularCloudLayouter); + var rectangles = GenerateLayout(sizes, _circularCloudLayouter); Assert_FirstRectangleIsPositionedAtProvidedCenter(rectangles, new Point(centerX, centerY)); } @@ -141,9 +147,9 @@ public void RectanglesShouldBeCloseToEachOther( int maxDistance, (int, int)[] sizes) { - var circularCloudLayouter = Arrange(centerX, centerY); + Arrange(centerX, centerY); - var rectangles = GenerateLayout(sizes, circularCloudLayouter); + var rectangles = GenerateLayout(sizes, _circularCloudLayouter); Assert_RectanglesArePositionedCloseToEachOther(rectangles, maxDistance); } @@ -157,21 +163,21 @@ public void RectanglesCommonBarycenterIsCloseToTheProvidedCenter( int centerY, (int, int)[] sizes) { - var circularCloudLayouter = Arrange(centerX, centerY); + Arrange(centerX, centerY); - var rectangles = GenerateLayout(sizes, circularCloudLayouter); + var rectangles = GenerateLayout(sizes, _circularCloudLayouter); Assert_RectanglesBarycenterIsCloseToCenter(rectangles, new Point(centerX, centerY)); } - private static CircularCloudLayouterImpl Arrange(int centerX, int centerY) + private void Arrange(int centerX, int centerY) { - return new CircularCloudLayouterImpl(new Point(centerX, centerY)); + _circularCloudLayouter.CloudCenter = new Point(centerX, centerY); } private IEnumerable GenerateLayout( (int, int)[] sizes, - CircularCloudLayouterImpl circularCloudLayouterImpl) + ICircularCloudLayouter circularCloudLayouterImpl) { return sizes .Select(((int w, int h) s) => @@ -220,7 +226,7 @@ private void Assert_RectanglesBarycenterIsCloseToCenter( { var barycenter = ComputeBaryCenter(rectangles); var deviationFromCenter = barycenter.SquaredDistanceTo(center); - deviationFromCenter.Should().BeLessOrEqualTo(maxDistanceFromBarycenter * maxDistanceFromBarycenter); + deviationFromCenter.Should().BeLessOrEqualTo(MaxDistanceFromBarycenter * MaxDistanceFromBarycenter); } private static object[][] IntersectionTestSource() From b781133a4f1e7fda1dd4285ab6339026340f7ea6 Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 16:50:46 +0500 Subject: [PATCH 11/19] added extensions for circular cloud layouter interface --- .../CircularCloudLayouterExtensions.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterExtensions.cs diff --git a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterExtensions.cs b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterExtensions.cs new file mode 100644 index 000000000..49a1ec11e --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterExtensions.cs @@ -0,0 +1,11 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public static class CircularCloudLayouterExtensions +{ + public static IEnumerable GenerateLayout(this ICircularCloudLayouter layouter, Size[] sizes) + { + return sizes.Select(layouter.PutNextRectangle); + } +} \ No newline at end of file From 9fe17b8b5876211fcc02e1e1b5bb6efb8c443fbd Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 17:04:39 +0500 Subject: [PATCH 12/19] added code for image generation --- .../TagsCloudVisualization/Program.cs | 26 +++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/TagsCloudVisualization/TagsCloudVisualization/Program.cs b/TagsCloudVisualization/TagsCloudVisualization/Program.cs index e5dff12bc..89b9a6f8c 100644 --- a/TagsCloudVisualization/TagsCloudVisualization/Program.cs +++ b/TagsCloudVisualization/TagsCloudVisualization/Program.cs @@ -1,3 +1,25 @@ -// See https://aka.ms/new-console-template for more information +using System.Drawing; +using System.Drawing.Imaging; +using TagsCloudVisualization; -Console.WriteLine("Hello, World!"); \ No newline at end of file +var sizes = new List(); + +var random = new Random(); +for (int i = 0; i < 50; i++) +{ + sizes.Add(new Size(random.Next(10, 50), random.Next(10, 50))); +} + +var layout = new CircularCloudLayouterImpl(new Point(1000, 1000)) + .GenerateLayout(sizes.ToArray()) + .ToArray(); + +#pragma warning disable CA1416 + +var filename = "./test.png"; +new Bitmap(2000, 2000) + .DrawRectangles(layout, new Pen(Color.Blue)) + .Save(filename, ImageFormat.Png); +Console.WriteLine($"File was saved to: {Path.GetFullPath(filename)}"); + +#pragma warning restore CA1416 \ No newline at end of file From b59e10b421a6636a0da4bf8c7edb7eab8caf978a Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 17:41:20 +0500 Subject: [PATCH 13/19] added bitmap extensions and special testing utils --- .../TestBitmapExtensions.cs | 30 +++++++++++++++++++ .../TagsCloudVisualization.Tests/TestType.cs | 8 +++++ .../BitmapExtensions.cs | 26 ++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 TagsCloudVisualization/TagsCloudVisualization.Tests/TestBitmapExtensions.cs create mode 100644 TagsCloudVisualization/TagsCloudVisualization.Tests/TestType.cs create mode 100644 TagsCloudVisualization/TagsCloudVisualization/BitmapExtensions.cs diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/TestBitmapExtensions.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/TestBitmapExtensions.cs new file mode 100644 index 000000000..7e4d9bb5d --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/TestBitmapExtensions.cs @@ -0,0 +1,30 @@ +using System.Drawing; + +namespace TagsCloudVisualization.Tests; + +internal static class TestBitmapExtensions +{ + public static Bitmap DrawFailedTestImage( + this Bitmap bitmap, + Rectangle[] rectangles, + Point centerPoint, + Point barycenterPoint, + int maxDistanceFromBarycenter, + TestType testType) + { +#pragma warning disable CA1416 + bitmap.DrawRectangles(rectangles, new Pen(Color.Blue)); + + if (testType != TestType.BarycenterTest) + return bitmap; + + bitmap.DrawEllipse( + new Rectangle(centerPoint.X, centerPoint.Y, maxDistanceFromBarycenter, maxDistanceFromBarycenter), + new Pen(Color.Lime)); + bitmap.DrawEllipse( + new Rectangle(barycenterPoint.X, barycenterPoint.Y, 1, 1), + new Pen(Color.Red)); +#pragma warning restore CA1416 + return bitmap; + } +} \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/TestType.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/TestType.cs new file mode 100644 index 000000000..53e7c0d0b --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/TestType.cs @@ -0,0 +1,8 @@ +namespace TagsCloudVisualization.Tests; + +public enum TestType +{ + NoTearDown, + BarycenterTest, + OtherTest +} \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization/BitmapExtensions.cs b/TagsCloudVisualization/TagsCloudVisualization/BitmapExtensions.cs new file mode 100644 index 000000000..deec008e3 --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization/BitmapExtensions.cs @@ -0,0 +1,26 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public static class BitmapExtensions +{ +#pragma warning disable CA1416 + + public static Bitmap DrawRectangles(this Bitmap bitmap, Rectangle[] rectangles, Pen pen) + { + var graphics = Graphics.FromImage(bitmap); + graphics.DrawRectangles(pen, rectangles); + graphics.Dispose(); + return bitmap; + } + + public static Bitmap DrawEllipse(this Bitmap bitmap, Rectangle boundingRect, Pen pen) + { + var graphics = Graphics.FromImage(bitmap); + graphics.DrawEllipse(pen, boundingRect); + graphics.Dispose(); + return bitmap; + } + +#pragma warning restore CA1416 +} \ No newline at end of file From 4cf895bb245351934a72aa638468bc1d81d0bf27 Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 18:16:06 +0500 Subject: [PATCH 14/19] refactored TearDown --- .../CircularCloudLayouterTests.cs | 71 ++++++++++--------- 1 file changed, 36 insertions(+), 35 deletions(-) diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs index 1fa891ba8..097bbaad1 100644 --- a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs @@ -12,7 +12,7 @@ namespace TagsCloudVisualization.Tests; [TestFixture] [TestOf(typeof(CircularCloudLayouterImpl))] -public class CircularCloudLayouterImplTests +public class CircularCloudLayouterTests { private static readonly string FailReportFolderPath = "./failed"; @@ -39,48 +39,52 @@ public void ReportFailures() var context = TestContext.CurrentContext; if (context.Result.Outcome.Status == TestStatus.Failed) { - var args = context.Test.Arguments; - var center = new Point((int) args[0]!, (int) args[1]!); if (context.Test.MethodName == null) { Console.WriteLine("Teardown error: test method name is null"); return; } - if (context.Test.MethodName.Contains(nameof(PutNextRectangle_ThrowsOnHeightOrWidth_BeingLessOrEqualToZero))) + var testType = DetermineTestType(context.Test.MethodName); + if (testType == TestType.NoTearDown) return; - var isClosenessTest = context.Test.MethodName.Contains(nameof(RectanglesShouldBeCloseToEachOther)); - - var sizesArr = ((int, int)[])(isClosenessTest ? args[3] : args[2]); + var rectangles = _circularCloudLayouter.Layout.ToArray(); - var rectangles = GenerateLayout(sizesArr, _circularCloudLayouter).ToArray(); var savingPath = $"{FailReportFolderPath}/{context.Test.Name}.png"; - Directory.CreateDirectory(FailReportFolderPath); - + + var args = context.Test.Arguments; + var center = new Point((int) args[0]!, (int) args[1]!); + #pragma warning disable CA1416 - var bitmap = new Bitmap(1000, 1000); - var graphics = Graphics.FromImage(bitmap); - graphics.Clear(Color.White); - graphics.DrawRectangles(new Pen(Color.Blue), rectangles); - var isCenterTest = context.Test.MethodName.Contains(nameof(RectanglesCommonBarycenterIsCloseToTheProvidedCenter)); - if (isCenterTest) - { - graphics.DrawEllipse( - new Pen(Color.Lime), center.X, center.Y, - MaxDistanceFromBarycenter, MaxDistanceFromBarycenter); - var barycenter = ComputeBaryCenter(rectangles); - graphics.DrawEllipse(new Pen(Color.Red), barycenter.X, barycenter.Y, 1, 1); - } - - bitmap.Save(savingPath, ImageFormat.Png); + new Bitmap(1000, 1000) + .DrawFailedTestImage( + rectangles.ToArray(), + center, + ComputeBaryCenter(rectangles), + MaxDistanceFromBarycenter, + testType) + .Save(savingPath, ImageFormat.Png); + #pragma warning restore CA1416 + Console.WriteLine($"Failure was reported to {Path.GetFullPath(savingPath)}"); } } + private static TestType DetermineTestType(string methodName) + { + if (methodName == nameof(PutNextRectangle_ThrowsOnHeightOrWidth_BeingLessOrEqualToZero)) + return TestType.NoTearDown; + + if (methodName == nameof(RectanglesCommonBarycenterIsCloseToTheProvidedCenter)) + return TestType.BarycenterTest; + + return TestType.OtherTest; + } + [Test] [Description("Проверяем, что метод PutNextRectangle бросает ArgumentException, " + "если ему передан размер прямоугольника с высотой или шириной " + @@ -115,7 +119,7 @@ public void RectanglesShouldNotIntersectEachOther( { Arrange(centerX, centerY); - var rectangles = GenerateLayout(sizes, _circularCloudLayouter); + var rectangles = GenerateTestLayout(sizes); Assert_RectanglesDoNotIntersect(rectangles); } @@ -131,7 +135,7 @@ public void FirstRectangleShouldBePositionedAtProvidedCenter( { Arrange(centerX, centerY); - var rectangles = GenerateLayout(sizes, _circularCloudLayouter); + var rectangles = GenerateTestLayout(sizes); Assert_FirstRectangleIsPositionedAtProvidedCenter(rectangles, new Point(centerX, centerY)); } @@ -149,7 +153,7 @@ public void RectanglesShouldBeCloseToEachOther( { Arrange(centerX, centerY); - var rectangles = GenerateLayout(sizes, _circularCloudLayouter); + var rectangles = GenerateTestLayout(sizes); Assert_RectanglesArePositionedCloseToEachOther(rectangles, maxDistance); } @@ -165,7 +169,7 @@ public void RectanglesCommonBarycenterIsCloseToTheProvidedCenter( { Arrange(centerX, centerY); - var rectangles = GenerateLayout(sizes, _circularCloudLayouter); + var rectangles = GenerateTestLayout(sizes); Assert_RectanglesBarycenterIsCloseToCenter(rectangles, new Point(centerX, centerY)); } @@ -175,13 +179,10 @@ private void Arrange(int centerX, int centerY) _circularCloudLayouter.CloudCenter = new Point(centerX, centerY); } - private IEnumerable GenerateLayout( - (int, int)[] sizes, - ICircularCloudLayouter circularCloudLayouterImpl) + private IEnumerable GenerateTestLayout((int, int)[] sizes) { - return sizes - .Select(((int w, int h) s) => - circularCloudLayouterImpl.PutNextRectangle(new Size(s.w, s.h))); + return _circularCloudLayouter.GenerateLayout( + sizes.Select(size => new Size(size.Item1, size.Item2)).ToArray()); } private void Assert_RectanglesDoNotIntersect(IEnumerable rectangles) From b4a2cd45174e0a181d2e075ecdfad083d6c6f79d Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 18:17:20 +0500 Subject: [PATCH 15/19] added Layout property --- .../TagsCloudVisualization/ICircularCloudLayouter.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/TagsCloudVisualization/TagsCloudVisualization/ICircularCloudLayouter.cs b/TagsCloudVisualization/TagsCloudVisualization/ICircularCloudLayouter.cs index 2e31f9809..7b4b58d79 100644 --- a/TagsCloudVisualization/TagsCloudVisualization/ICircularCloudLayouter.cs +++ b/TagsCloudVisualization/TagsCloudVisualization/ICircularCloudLayouter.cs @@ -6,4 +6,5 @@ public interface ICircularCloudLayouter { public Rectangle PutNextRectangle(Size rectangleSize); public Point CloudCenter { get; set; } + public IEnumerable Layout { get; } } \ No newline at end of file From f103f66441bf89c94818561ad0a7bec7d7768491 Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 18:18:14 +0500 Subject: [PATCH 16/19] changed parameters --- .../TagsCloudVisualization/CircularCloudLayouterImpl.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs index 8b6f24b39..6d6773d89 100644 --- a/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs +++ b/TagsCloudVisualization/TagsCloudVisualization/CircularCloudLayouterImpl.cs @@ -4,9 +4,9 @@ namespace TagsCloudVisualization; public class CircularCloudLayouterImpl : ICircularCloudLayouter { - private static readonly float TracingStep = 0.01f; + private static readonly float TracingStep = 0.001f; private static readonly float MaxTracingDistance = 1000f; - private static readonly int MaxCycleCount = 6; + private static readonly int MaxCycleCount = 7; public Point CloudCenter { @@ -21,6 +21,8 @@ public Point CloudCenter } } + public IEnumerable Layout => _generatedLayout.AsEnumerable(); + private Point _cloudCenter; private List _generatedLayout = new(); private double _nextAngle; From fa609adaac907d917e79c6cb798f984a49beadaf Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 18:23:35 +0500 Subject: [PATCH 17/19] moved test case sources into TestCaseData --- .../CircularCloudLayouterTests.cs | 165 +----------------- .../TestCaseData.cs | 161 +++++++++++++++++ 2 files changed, 165 insertions(+), 161 deletions(-) create mode 100644 TagsCloudVisualization/TagsCloudVisualization.Tests/TestCaseData.cs diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs index 097bbaad1..1b4eafed6 100644 --- a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs @@ -111,7 +111,7 @@ public void PutNextRectangle_ThrowsOnHeightOrWidth_BeingLessOrEqualToZero( [Test] [Description("Проверяем, что прямоугольники не пересекаются друг с другом")] - [TestCaseSource(nameof(IntersectionTestSource))] + [TestCaseSource(typeof(TestCaseData), nameof(TestCaseData.IntersectionTestSource))] public void RectanglesShouldNotIntersectEachOther( int centerX, int centerY, @@ -127,7 +127,7 @@ public void RectanglesShouldNotIntersectEachOther( [Test] [Description("Проверяем, что центр прямоугольника, размер которого был передан первым " + "совпадает с центром, переданным в аргумент конструктора CircularCloudLayouter")] - [TestCaseSource(nameof(FirstRectanglePositionTestSource))] + [TestCaseSource(typeof(TestCaseData), nameof(TestCaseData.FirstRectanglePositionTestSource))] public void FirstRectangleShouldBePositionedAtProvidedCenter( int centerX, int centerY, @@ -144,7 +144,7 @@ public void FirstRectangleShouldBePositionedAtProvidedCenter( [Description("Проверяем, что прямоугольники расположены наиболее плотно, " + "то есть максимум из попарных расстояний между центрами " + "прямоугольников не превышает maxDistance")] - [TestCaseSource(nameof(DensityTestSource))] + [TestCaseSource(typeof(TestCaseData), nameof(TestCaseData.DensityTestSource))] public void RectanglesShouldBeCloseToEachOther( int centerX, int centerY, @@ -161,7 +161,7 @@ public void RectanglesShouldBeCloseToEachOther( [Test] [Description("Проверяем, что общий центр масс всех прямоугольников находится " + "рядом с центром, переданным в конструктор CircularCloudLayouter")] - [TestCaseSource(nameof(CenterTestSource))] + [TestCaseSource(typeof(TestCaseData), nameof(TestCaseData.CenterTestSource))] public void RectanglesCommonBarycenterIsCloseToTheProvidedCenter( int centerX, int centerY, @@ -229,161 +229,4 @@ private void Assert_RectanglesBarycenterIsCloseToCenter( var deviationFromCenter = barycenter.SquaredDistanceTo(center); deviationFromCenter.Should().BeLessOrEqualTo(MaxDistanceFromBarycenter * MaxDistanceFromBarycenter); } - - private static object[][] IntersectionTestSource() - { - return - [ - [ - 500, 500, - new[] - { - (20, 10), - (40, 20), - (60, 30), - (80, 40) - } - ], - [ - 500, 500, - new[] - { - (10, 10), - (10, 10), - (20, 10), - (20, 10) - } - ], - [ - 600, 600, - new[] - { - (20, 10), - (30, 15), - (50, 10), - (60, 30), - (30, 10), - (40, 20) - } - ] - ]; - } - - private static object[][] FirstRectanglePositionTestSource() - { - return - [ - [ - 500, 500, - new[] - { - (20, 30), - (30, 45), - (40, 60) - } - ], - [ - 510, 550, - new[] - { - (10, 40), - (10, 30), - (10, 20) - } - ], - [ - 300, 800, - new[] - { - (10, 30) - } - ] - ]; - } - - private static object[][] DensityTestSource() - { - return - [ - [ - 500, 500, 3025, - new[] - { - (20, 20), - (30, 30), - (40, 40) - } - ], - [ - 500, 500, 3025, - new[] - { - (20, 20), - (40, 40), - (30, 30) - } - ], - [ - 600, 400, 4225, - new[] - { - (40, 40), - (30, 30), - (20, 20), - (10, 10) - } - ], - [ - 400, 550, 3025, - new[] - { - (20, 20), - (30, 30), - (40, 40), - (10, 10) - } - ] - ]; - } - - private static object[][] CenterTestSource() - { - return - [ - [ - 500, 500, - new[] - { - (10, 20), - (10, 60), - (10, 60), - (10, 20) - } - ], - [ - 300, 500, - new[] - { - (10, 40), - (10, 50), - (20, 30), - (40, 30) - } - ], - [ - 520, 410, - new[] - { - (10, 20), - (20, 30), - (30, 40), - (40, 50), - (50, 40), - (40, 30), - (30, 20), - (20, 10) - } - ] - ]; - } } \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/TestCaseData.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/TestCaseData.cs new file mode 100644 index 000000000..eb0b5e2fa --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/TestCaseData.cs @@ -0,0 +1,161 @@ +namespace TagsCloudVisualization.Tests; + +public static class TestCaseData +{ + public static object[][] IntersectionTestSource() + { + return + [ + [ + 500, 500, + new[] + { + (20, 10), + (40, 20), + (60, 30), + (80, 40) + } + ], + [ + 500, 500, + new[] + { + (10, 10), + (10, 10), + (20, 10), + (20, 10) + } + ], + [ + 600, 600, + new[] + { + (20, 10), + (30, 15), + (50, 10), + (60, 30), + (30, 10), + (40, 20) + } + ] + ]; + } + + public static object[][] FirstRectanglePositionTestSource() + { + return + [ + [ + 500, 500, + new[] + { + (20, 30), + (30, 45), + (40, 60) + } + ], + [ + 510, 550, + new[] + { + (10, 40), + (10, 30), + (10, 20) + } + ], + [ + 300, 800, + new[] + { + (10, 30) + } + ] + ]; + } + + public static object[][] DensityTestSource() + { + return + [ + [ + 500, 500, 3025, + new[] + { + (20, 20), + (30, 30), + (40, 40) + } + ], + [ + 500, 500, 3025, + new[] + { + (20, 20), + (40, 40), + (30, 30) + } + ], + [ + 600, 400, 4225, + new[] + { + (40, 40), + (30, 30), + (20, 20), + (10, 10) + } + ], + [ + 400, 550, 3025, + new[] + { + (20, 20), + (30, 30), + (40, 40), + (10, 10) + } + ] + ]; + } + + public static object[][] CenterTestSource() + { + return + [ + [ + 500, 500, + new[] + { + (10, 20), + (10, 60), + (10, 60), + (10, 20) + } + ], + [ + 300, 500, + new[] + { + (10, 40), + (10, 50), + (20, 30), + (40, 30) + } + ], + [ + 520, 410, + new[] + { + (10, 20), + (20, 30), + (30, 40), + (40, 50), + (50, 40), + (40, 30), + (30, 20), + (20, 10) + } + ] + ]; + } +} \ No newline at end of file From cfd18ff377a067335a7f7c5d69f4c409377a5abb Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 18:53:19 +0500 Subject: [PATCH 18/19] added CloudCenter property test --- .../CircularCloudLayouterTests.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs index 1b4eafed6..aa4991c5b 100644 --- a/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs +++ b/TagsCloudVisualization/TagsCloudVisualization.Tests/CircularCloudLayouterTests.cs @@ -85,6 +85,19 @@ private static TestType DetermineTestType(string methodName) return TestType.OtherTest; } + [Test] + [Description("Проверяем, что поле CloudCenter бросает исключение, " + + "если процесс генерации облака уже начался")] + public void CloudCenter_ThrowsIfLayoutContainsGeneratedRectangles() + { + _circularCloudLayouter.PutNextRectangle(new Size(1, 1)); + + Action act = () => _circularCloudLayouter.CloudCenter = new Point(1, 1); + + act.Should().Throw() + .WithMessage("Can not change cloud center after generation start"); + } + [Test] [Description("Проверяем, что метод PutNextRectangle бросает ArgumentException, " + "если ему передан размер прямоугольника с высотой или шириной " + From 75176c184cbc0812d418e82015edb6de045d166b Mon Sep 17 00:00:00 2001 From: Nikita Shevyrin Date: Sat, 16 Nov 2024 18:56:09 +0500 Subject: [PATCH 19/19] added readme --- .../TagsCloudVisualization/README.md | 11 +++++++++++ .../TagsCloudVisualization/generation_200.png | Bin 0 -> 29921 bytes .../TagsCloudVisualization/generation_2000.png | Bin 0 -> 238081 bytes .../TagsCloudVisualization/generation_50.png | Bin 0 -> 6842 bytes 4 files changed, 11 insertions(+) create mode 100644 TagsCloudVisualization/TagsCloudVisualization/README.md create mode 100644 TagsCloudVisualization/TagsCloudVisualization/generation_200.png create mode 100644 TagsCloudVisualization/TagsCloudVisualization/generation_2000.png create mode 100644 TagsCloudVisualization/TagsCloudVisualization/generation_50.png diff --git a/TagsCloudVisualization/TagsCloudVisualization/README.md b/TagsCloudVisualization/TagsCloudVisualization/README.md new file mode 100644 index 000000000..1269415ba --- /dev/null +++ b/TagsCloudVisualization/TagsCloudVisualization/README.md @@ -0,0 +1,11 @@ +## Облако из 50 прямоугольников: + +![screenshot](generation_50.png) + +## Облако из 200 прямоугольников: + +![screenshot](generation_200.png) + +## Облако из 2000 прямоугольников: + +![screenshot](generation_2000.png) \ No newline at end of file diff --git a/TagsCloudVisualization/TagsCloudVisualization/generation_200.png b/TagsCloudVisualization/TagsCloudVisualization/generation_200.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8324f389e439fd9cd35544ef8c8eb8a62821c9 GIT binary patch literal 29921 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 literal 0 HcmV?d00001 diff --git a/TagsCloudVisualization/TagsCloudVisualization/generation_2000.png b/TagsCloudVisualization/TagsCloudVisualization/generation_2000.png new file mode 100644 index 0000000000000000000000000000000000000000..e067ac5a94f73ce4aea422a78118dcf04dc23ece GIT binary patch literal 238081 zcmeFa3tZCo{y*ONe$UqTw7%=~UDk11dX{H1Z*$39Gep-)UDh;}OK8fP0!u5GBq*q~ z)9I#`GjCynrI`vSC6OT_Tg|*7ObrcFT&0kRkQX3D;Qv9awA-%d@q0Y}kK^OfqlYP< z_v`X}K3}i*<@4_N_Mm|OUGnCVMT-{w@0QOthb~&Q_(#j1|9KVom%@*KNCy7;6D~C1 z(?!*yw}*jm{*2xD`Nl(d*YOfBw`IUlFrtk-2Qk=8e## zD3vs$bK>fWsynIX^$^mIH{RRhSCjPJu8ji*XyqyOz@JxsQXb7S+XGMe&)0t<@Sh0$ zCj$S8z<(m}?}&i&bg{W|YTlE-px+f_%28+k`^mov$J~GX)01x>qGnz@@Z{S?rd8(u zTK(kvgXTuTCySqa{}XxM$7_0*U0c3v(V|bn#&CZsM$i4$Pg%zvZai&I{nMgPnx1^N z`L4x^gP%Pa?Vzjal?{s)9sA+`$G`MlxIxh{eaPEJFD6-94a=A5*fINmO?B8VGOg5- z)f48eTxWH$eyR0`i)NND_x+!VQqZCqH>J5xVJ=93_4#US=YIOoVNKd!_niR^@EG)~awKy%P{&E3Vj(hj`3=&gLSw{`~0p7zyGnag(0 z_c7|SeP|VJ+j1it`{#qKi!+K!h3^^3b1c55JbF`QALB4>arxFC{fh@3M~jysgZ=Wk z5W?Ap0lMC7v%tz7#%~LahxTkH1MWQd$4K!qn3)?xxs6+_G*scuZmibm@99D3(*F5(x^r?>0`xXHY~7=D{A;>3t9iLm(0Q*wWonkF z2S&US5n*?RZP&EdJ zf*xbUO;}3&NlMMQlNx;ly-&QlLQ~soWDHhasr7flH5%tE{O&`B{YEx<+ll+;JUfAK zGM+V-@@-R`d1a!_z+2H5m?`Nb%C319Ge)aIT6gXz&yD;+yE5QMm3>%*`B+oL<}4Iu znuHP3%&duCfnQ{!{>Eu1m*Trom>qIm-#61~jDA6&ES40P>w)Nd)ZK1lPcP5458E4~ z*?&QR^_K;3>vi!Vh%x>;OlxcT)dJhORK)68r)qm;ZGHO-m+MIjKhs@Hu# zD{d2kx&}bejrt!8l12wgs_&Abg}Hgb``tmVIFkC4RDnc|dN-cK_Y9=Cs2|1r0@C<<9*_5i84VS-DtvUqoBX)Xcm26GU~8F^bNQhyGmDN;^}N z&>@9mfytOgK4%-8yFxJ$;=MK{S-2g z_gvgwmfTr9jFTo?P!FwJ#&Qh=MLCI?S8MZIoC}&#Y{6$ncT?JNqRiFR+r@;k7vT5d z#_64S8pTAj%~M}@$>_{Pw1QmJRp^@5p>?PmA`B@UGf@PJKI(FFBC_(i{9Ooz2dyO^ z-pd;orjz0*%!FiN!6mkomM`^I2yfk4qD}cvIQ|okm!JcvVPPji<>`jG4)EY^xbHv5 z4_!WCmAR+HBCjpFA(Ps!yDXG@VHs7XpW?UI#mNYB66<5B4s_o^23j;LvCoKwx4i9^ zbWd>G9$OqS4m4Keiz@k0+=G8@?(^m^v<_cM>=_ad>=T}5Cf+8ClV~&3>^D{>@@uF` zw-rmWrabT;-R|;;xKSi?7M;(ZiqpJSmfY}A;5GN8BfVM2q~haU6I8$arLh#YwO$;s zk3!z4vz;(0ZP!gyXGZdO&nJwBd=kF@J&q7XLal9|Xf(IamCO%vjShErlNmErL5=p% zr)&esjS|q8@<>}AvC9KFG=ADW8q0>bvC+ces=M1_DFR)?_CiI5`OI8+zgTMs_@T=L zpNgQS`&Q8B2g-H?BQ!9uKL~jqchPe|qr3gI9w9zPA)r;t&)Z_2Brbnld2KqV5^d@=e7c+FZi;{1 z8nc7vRQAh*4G}}}iO#08^n9*n-9$2uaN!y|Rw2y1RE@|&rD-!yCnFf=rgvPVgT^bS zFo0xU$@JpGinh2-^vG5PPNa;Hfkm*{ucc`7v83JsXEGyfY_TMrk_VLz1O>6AKmrT~ zOU(YK3iU%53HhrZ6({#OI$pZjO`Jn5x+khC-Z!HONz+cYz5&5*7RavC3j*Z#`Rmz` z+as>Utjdpb!sRT!d#-%yu30{3+TU7D%f~JYU?zC^-DUJ1p%PRv#7I!ky+8>@<#3)O zQFJVge-!4PCF~%@dl1t?8X$eI{T~@4h*N{jKe}_JF)Vn2?dD?Wu;? zctD{qehe8LKLy1-u?G~rl0zF6*V8^*ZX{;yztPpy8<}+sd%!sIKemu6SkXqeiB+=2 z4gh_wM9jtKMh$uM;9?2rabzr(OvQ@3uiv9^#(N`|LmK`b9UM#O8drHsD$vzeucMxJ zC)*w>-U(ue&*rmQsp3K5=^+LLLS){|EWFg2^KL0YUQfV}SG0d{?==$Q!aNQ5ZU+GA znX^QBAu{zoDT-%lZEwG7uyWF*Y`92319;tAJNMa4 z0Ito;=-6tC1iQTrF(kq!V1(lmnjHil3#WE$#dK%NVhQY=@=gQ8a7~uy)IP!K|1ax@ zKgc&atnsa&aWU}Xjc%wsaB&M|T^oW#oZL}~O!RlBAVEY%e|r!uP{UIHzjS!7UD=~v z+79ryV$uNvNE&O_<(_e9vP@WiqxXe&*LHhs_L&RU-`_DTZX3xe_Z|`7pYDmhIRVSR zbepA{yniW_t;~$_U}GlXyfakqJQ=Egm2RJ#$EL4=VT!8!Fcl9UO-dhxNPTy}r@z1aDO{WBW>1>T&YrR&lDVO@K*+S^OVk+0;4(cz zf0!SUA>2L&nN#eaN^8g$nUjZhA7(0TBYbrC9ULZJ9HNz!b9Wz2iaEh`kU%sjwE(zYY};9 zjyeY;e(&c;7uTrD)0ZGwJXq>YSaVX|&q8^D0gJYbF0Kn)CW76HZsdu6mO#=Fv`CQf zX!`#5bJwzJY{(z~+RvHFjBEck_EXg1erUbmXTeNa4U^Bf=;zAgPpCC%D+Z4?VQuhX zW2T=+B_2wdVD-%j-9hs4haunE+ZDrZwMX92>1&EnGE?7m1WA_~;md|c@mxxd<~^7H z3xhVZ^@pr~&OCU?ytYs6fl;K56lVu>v7|^j?(XDF<}o|?b0trB(ivyUGtBYif%|gb zCF9rcv6t|;ZKtV*Dzd-N5RIZw>;} zefK79%Y|?60RE`@;*Gb9&3V`xsuAxZ-N|Mew-}bENjTcuf7#nREvu$EMajDu`t%bv zO6=`y5?~KQbni#w)k{cWr?{*x*>b51zu0+T=wu+Fl-~M!M3B}oFow15nN&cHcS7Dl z9JWVmfIyfe0wYq}R2a~XEayAaVAWXI5U(#}bl(aZgC{8e41$dT+9G_q{=K;%Yyo0G zH$ABMmH{A%V9Umtm8f0if}}xlU(0R{o~9@c&d-!lCaOc5i3R6cUzgzg<%|Suc~bmb zwf%O*Sm{~ivaBUs=b5#nf^}d$%VdL}&Im9GsZhbPnSdLSaH4r_48LtV`l!;&VFJcw zht;p21Jh^e4@0(Vj|LpxX_J=Aw`2ifUII2YI*{c-YGSPbF*b(p2^&40-+?Rmw41jS zhOeN3Jb;=GZX~^7b>ZOoWA?AW$Vt#<*qs0=FH_1TYgre&P~PKM^Mv`wugCf_gKWh?nJ=c=ZG1(d?mE!$P zd8B(rvpt3P&;?ih$d^w(mDq=wTC+acD`J+PI#y2yhcvir^&$8Mlu<&^->@bJQD1sY zs3cV;#b>Y3;Q(y#$4urdVdPAn7XsSymsx}UeomR?L>>w_%k*N5u3y7a28F*rw5PRZ z!l-05@YdT+fd~mbyt}LYV&DT?8%Y`GFBStiR-e$D$ua7?EFrffFv#lJUtr{IQ!c*$ zg>Fag6)aDN5jqo`uwnUB4T7xg=Z`H&m2-bYTj5v?ukGx&aYro4et~;P9Q=0t<|qmE z^3GOiE?Qxbpi&9(3vsg!Wzckp(@|dL&$fAyz4k?-NAp+ zeJ`w4?32Qa9R(&~7#<+4kW^WR)yX% zsXf*X7M`<+ko^5W+|&r4yrvw2F(iid#v@U9QM$5TVQfG|C1QUWw4A5vahpXgbDH_n zA-d^wNfF8OHme8QjvP&0o?WZmp4uRayP@hgDpAHL$O7?PhdR(LNweiauL^iemvAu^ z3TTUh>W~m5J7Z<1J@lD8t%QXCuOxtiXix!qj1c53BzxOw_YEVl0^PJ=dS|~8;-~b2 zjVCLP73ItortcQRjO+Zo^s!e^EO8-QJ2a(H#&^8KdQAPL;5Uy08I5CeOCv>j0p?IyLl~{>{!IvXRTYm!POhiq=7?2rJs5Bpy0-!`f(Rk8MeaOB0MLf`R;vj zm)(WdENu6e*hen}-KExj{Qs6vo#n9~9 z*R@vf<1buL8Y_o-+e_;PY<@}pZPp!CR?}wk^sTO}nI)uIMr!qv^j5Yy#(b?`Hk&8` zrI4;K&yQQ5rA$Ml?6RK2IOst){jIc!hmJ@EHXlI2@!XrpmmuKR*gBJEpIsy0lj@?m z6b10xkS|uRe#(QDQ9|x52S-t3xWDZmOfD1 zbO_OJ1GfztS*!XKIb>7;c{1F21S%-sm$Q?X4At}Q&WHc$+CCdaU0ac7z(~aYqf{7v zWOar5fG6UIx9L1$sGH{aMjYS<43#Xu|SryMi|I31!6Pp|?6e%y|M1gPv(MPD|Z6yr}Qs7E?bx5}7S!sJ5)b9(d0J2-twb)2#UR{N(ivLVmihhq3i- zNbm^axlofLA^6TXjN0&z>q+thNAR+H$V=12cmEv^e>H10vwO1nukU)0@*qy~OwnM6 zMIlL>pB9NzxoJsbqR_E`3n)sdVz<%x`A}vw1rghYsl_pW6Bmhox^zfVXlGlp8N;e^ zd19P4x4hDRWRN8)1VDG0TvO~ET1EHN&9ybWNU|d(5cM+?RqwJX8#aEem^-} z@Qi9K0Jx*=4Ny5KN%aNiLco!=F9^EdnRC-`ubdKmT`*hiKgsM|_PWJ`tK)y52isF$ z&zM17-8wtO2bJc(CrsB{8qR(v&ua@xyP#!9UR zx4w`4JZou)g|=Zs24+yA-ZDVS9ezKi!sn=;$-VF0Sw~K<&_@6BcZLf(<-_}E( zkH^3sxB1%ree`06C&Xj(abXlXI8VdQpnXp-R;ncl9B;C*Qn-e!wVqZ!_)3WHduxq9 zeV1iF?L3eT)4>%iZx=X9;81e(U2T2-6eceDMYN-*6h}@jg&Uy+^I`oD1;8qE#!S8A z?Cj&=CTrZ!b!OSS#SLM5BC7(I&1_cH_O7P?;&6+1R$b`~+n84r>^hDZu+D0B{MAY{ z$W}veR@13O{%66`rbwi(q_6$#g&F5Ox>pj0XHlHhfnMy`E5~+9WLuTVZWHa@ z<1eZ_79qNC%bc!M%RmL4Lb^dfKQ(dO&!hxf9e8anx7e}fn8>i*@eEoGsU5l>(Mo}_ z{RZi}s8DenCH_kOi^^tst6u6S{z4L*sHbsrG4Osf?D;v)2zYO#Fpw0X&Fzo7kj@Jg zF$=4P?oMd}DF2@L;D+>emv=N20GO{QliG#my+zN|{NHYT5w%LodhioUl|}^jBBaz6fyc@Ul$+s*l^!Puy@u_ixxn}~mxVc=-xDCsWP^<5MESQsgC(x4Oy;wMtQ*}=P_Tty}2W8W{M!1QF;yNWk5W+Zb*30H15o<2Ky zXp{JEc1zubP8pn!jwjn`GpoteElzDP{6|Cm2bS9c(@u)mJ)Yc9+A~=J8Cj5h^m>De zJC+F3{f4N;OG`04T}W@G#icOW=c}@__09ZRnVppQ`C%?$b}sU$VZyV;w6{%jx?+tg-)fhEojaF(laQFh|k)?zi_Q@)R#b0tHmp5HUx$F8YnuYUq#vT zB>#WF7~_4n!q642rNR?<` zl?2Bx&;q9-Ggtk}B*z(Dyk%;lGX!ZJ#h^k4i?>t4P0og*r+w%TXDGb!m&3Xon%@6a z!#HCP9TDoAEg23ppQ$hj#MGJ5Os$1?(mf(~v2LqXtl|>!aaFX5TOC24XT8nKt(oae zfRlreH?5V=?^yyqjuse4R*I{6;UF<8$7>={za;ql{j_fUc!b!yn^7Z{7NKaP1y+Lh zC{^9z5XGfZYN4GM-U&TbHUv!t*bLi$e~w z5)iY4efP=J{X&GULRy`gi>Iduob|OM{}>P<%ToQc=|#hItw=?-q5AFCtp-n3VeLj> zQpFxoSF)>qIrnyV+g)j50{$pWki$iYlT}}pUkErE8Hh{^Y4G1NT-AXGa%= z=A)oE(O@hqgftt}A1;4>%RYYZj zA~`aOkyXN8+ujiED9{R{`4+qT*k-mF1z zakGw@J_HD z{A5ML%2cRY`7iBKCD^N_7N;BCHrP-?^b;MB5V1Nzx~Sws!%6B)Hz-R>SK&TV414Dr zwzuAO+wcOABvhhV35r?wW_GVc{X~e{T+ADPIQC`Pg#hzvq*uvw_+$u|@kTeOLNf?J zL|O~VHl!5{P|OjUh%*uTX;O>!?e+)9M+zG*B_TS9uXLYSTBKxg?CyVon2*zE%? z7BPv(uF=~_ToNuYy1{HS?7+%0DM2+@OG{=V(8X-8V8x}rqoFI~JCIe=oDDn<{3&|p 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%0DjpR#QDCasE*0eQH2_T_vuSt_KloHd3@_WCFDOT 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

J~jWfpD#vyGYU;(4!jKwrJo!-GQ_BGLfUe3 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