From edbd9b5c571991218263ff3fa8f91bae8f409976 Mon Sep 17 00:00:00 2001 From: Irina_Yatsenko Date: Tue, 5 Dec 2023 16:36:44 +0500 Subject: [PATCH 01/10] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/TagsCloudVisualization/App.config | 14 +++ .../CircularCloudLayouter.cs | 50 +++++++++ .../ICircularCloudLayouter.cs | 10 ++ cs/TagsCloudVisualization/Program.cs | 14 +++ .../Properties/AssemblyInfo.cs | 36 +++++++ .../TagsCloudVisualization.csproj | 85 +++++++++++++++ cs/TagsCloudVisualization/packages.config | 8 ++ .../CircularCloudLayouterTests.cs | 93 ++++++++++++++++ .../Properties/AssemblyInfo.cs | 20 ++++ .../TagsCloudVisualizationTest.csproj | 100 ++++++++++++++++++ cs/TagsCloudVizuaizationTest/app.config | 11 ++ cs/TagsCloudVizuaizationTest/packages.config | 10 ++ cs/tdd.sln | 26 ++++- 13 files changed, 473 insertions(+), 4 deletions(-) create mode 100644 cs/TagsCloudVisualization/App.config create mode 100644 cs/TagsCloudVisualization/CircularCloudLayouter.cs create mode 100644 cs/TagsCloudVisualization/ICircularCloudLayouter.cs create mode 100644 cs/TagsCloudVisualization/Program.cs create mode 100644 cs/TagsCloudVisualization/Properties/AssemblyInfo.cs create mode 100644 cs/TagsCloudVisualization/TagsCloudVisualization.csproj create mode 100644 cs/TagsCloudVisualization/packages.config create mode 100644 cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs create mode 100644 cs/TagsCloudVizuaizationTest/Properties/AssemblyInfo.cs create mode 100644 cs/TagsCloudVizuaizationTest/TagsCloudVisualizationTest.csproj create mode 100644 cs/TagsCloudVizuaizationTest/app.config create mode 100644 cs/TagsCloudVizuaizationTest/packages.config diff --git a/cs/TagsCloudVisualization/App.config b/cs/TagsCloudVisualization/App.config new file mode 100644 index 000000000..b0ffe2815 --- /dev/null +++ b/cs/TagsCloudVisualization/App.config @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cs/TagsCloudVisualization/CircularCloudLayouter.cs b/cs/TagsCloudVisualization/CircularCloudLayouter.cs new file mode 100644 index 000000000..d37632ef4 --- /dev/null +++ b/cs/TagsCloudVisualization/CircularCloudLayouter.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; + +namespace TagsCloudVisualization +{ + public class CircularCloudLayouter : ICircularCloudLayouter + { + public Point Center { get; set; } + public List Rectangles = new List(); + private double _angle; + private readonly int _step = 1; + + public CircularCloudLayouter(Point center) + { + Center = center; + } + + public Rectangle PutNextRectangle(Size rectangleSize) + { + if (rectangleSize.Width <= 0 + || rectangleSize.Height <= 0) + throw new ArgumentException(); + + var rectangle = new Rectangle(FindNewRectanglePosition(), rectangleSize); + + while (HaveIntersection(rectangle)) rectangle.Location = FindNewRectanglePosition(); + + Rectangles.Add(rectangle); + return rectangle; + } + + public Point FindNewRectanglePosition(double deltaAngle = 0.1) + { + _angle += deltaAngle; + var k = _step / (2 * Math.PI); + var radius = k * _angle; + + var position = new Point( + Center.X + (int)(Math.Cos(_angle) * radius), + Center.Y + (int)(Math.Sin(_angle) * radius)); + + return position; + } + + public bool HaveIntersection(Rectangle newRectangle) => + Rectangles.Any(rectangle => rectangle.IntersectsWith(newRectangle)); + } +} diff --git a/cs/TagsCloudVisualization/ICircularCloudLayouter.cs b/cs/TagsCloudVisualization/ICircularCloudLayouter.cs new file mode 100644 index 000000000..04e856bec --- /dev/null +++ b/cs/TagsCloudVisualization/ICircularCloudLayouter.cs @@ -0,0 +1,10 @@ +using System.Drawing; + +namespace TagsCloudVisualization +{ + public interface ICircularCloudLayouter + { + Point Center { get; set; } + Rectangle PutNextRectangle(Size rectangleSize); + } +} diff --git a/cs/TagsCloudVisualization/Program.cs b/cs/TagsCloudVisualization/Program.cs new file mode 100644 index 000000000..d4d715f5b --- /dev/null +++ b/cs/TagsCloudVisualization/Program.cs @@ -0,0 +1,14 @@ +using System.Drawing; + +namespace TagsCloudVisualization +{ + internal class Program + { + public const int ImageWidth = 800; + public const int ImageHeight = 800; + public static void Main(string[] args) + { + new CircularCloudLayouter(new Point(ImageWidth / 2, ImageHeight / 2)); + } + } +} diff --git a/cs/TagsCloudVisualization/Properties/AssemblyInfo.cs b/cs/TagsCloudVisualization/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..389c37b82 --- /dev/null +++ b/cs/TagsCloudVisualization/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Общие сведения об этой сборке предоставляются следующим набором +// набора атрибутов. Измените значения этих атрибутов для изменения сведений, +// связанные с этой сборкой. +[assembly: AssemblyTitle("TagsCloudVisualization")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TagsCloudVisualization")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми +// для компонентов COM. Если необходимо обратиться к типу в этой сборке через +// из модели COM задайте для атрибута ComVisible этого типа значение true. +[assembly: ComVisible(false)] + +// Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM +[assembly: Guid("4f909c58-0835-4f9f-ba74-9530c220d676")] + +// Сведения о версии сборки состоят из указанных ниже четырех значений: +// +// Основной номер версии +// Дополнительный номер версии +// Номер сборки +// Номер редакции +// +// Можно задать все значения или принять номера сборки и редакции по умолчанию +// используя "*", как показано ниже: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj new file mode 100644 index 000000000..ab115bd97 --- /dev/null +++ b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj @@ -0,0 +1,85 @@ + + + + + + + Debug + AnyCPU + {4F909C58-0835-4F9F-BA74-9530C220D676} + Exe + TagsCloudVisualization + TagsCloudVisualization + v4.8 + 512 + true + true + + + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\FluentAssertions.6.12.0\lib\net47\FluentAssertions.dll + + + ..\packages\NUnit.4.0.0\lib\net462\nunit.framework.dll + + + ..\packages\NUnit.4.0.0\lib\net462\nunit.framework.legacy.dll + + + + + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.0\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + + + + + + + + + + + + + + + + + + + + + + Данный проект ссылается на пакеты NuGet, отсутствующие на этом компьютере. Используйте восстановление пакетов NuGet, чтобы скачать их. Дополнительную информацию см. по адресу: http://go.microsoft.com/fwlink/?LinkID=322105. Отсутствует следующий файл: {0}. + + + + + \ No newline at end of file diff --git a/cs/TagsCloudVisualization/packages.config b/cs/TagsCloudVisualization/packages.config new file mode 100644 index 000000000..a29a2ff71 --- /dev/null +++ b/cs/TagsCloudVisualization/packages.config @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs b/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs new file mode 100644 index 000000000..085f447fe --- /dev/null +++ b/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using NUnit.Framework; +using TagsCloudVisualization; +using FluentAssertions; + +namespace TagsCloudVizualizationTest +{ + [TestFixture] + public class CircularCloudLayouterTests + { + private CircularCloudLayouter layouter; + + [SetUp] + public void Initial() => + layouter = new CircularCloudLayouter(new Point(400, 400)); + + [Test] + public static void CircularCloudLayouterCtor_WhenPassValidArguments_DoesNotThrowException() => + Assert.DoesNotThrow(() => new CircularCloudLayouter(new Point(200, 200))); + + public static TestCaseData[] InvalidArguments = + { + new TestCaseData(-200, 200).SetName("PassNegativeWidth"), + new TestCaseData(200, -200).SetName("PassNegativeHeight"), + new TestCaseData(-200, -200).SetName("PassNegativeArguments"), + new TestCaseData(0, 0).SetName("PassOnlyZero") + }; + + [TestOf(nameof(CircularCloudLayouter.HaveIntersection))] + [TestCaseSource(nameof(InvalidArguments))] + public void WhenPassInvalidArguments_ShouldThrowArgumentException(int width, int height) => + Assert.Throws(() => layouter.PutNextRectangle(new Size(width, height))); + + [Test] + public void WhenPutNewRectangle_ShouldBeAddedToList() + { + layouter.PutNextRectangle(new Size(4, 2)); + + layouter.Rectangles.Count.Should().Be(1); + } + + private static readonly List Rectangles = new List + { + new Rectangle(new Point(400, 400), new Size(4, 2)) + }; + + public static TestCaseData[] RectanglesPosition = + { + new TestCaseData(new Rectangle(new Point(400, 402), new Size(4, 2))) + .Returns(false).SetName("NotIntersectedRectangles2"), + new TestCaseData(new Rectangle(new Point(400, 402), new Size(6, 2))) + .Returns(false).SetName("NotIntersectedRectanglesOfDifferentSizes"), + + new TestCaseData(new Rectangle(new Point(400, 400), new Size(4, 2))) + .Returns(true).SetName("IntersectedRectanglesInOnePoint"), + new TestCaseData(new Rectangle(new Point(402, 400), new Size(4, 2))) + .Returns(true).SetName("IntersectedRectangles") + }; + + [TestOf(nameof(CircularCloudLayouter.HaveIntersection))] + [TestCaseSource(nameof(RectanglesPosition))] + public bool WhenPassSeveralRectangles_ShouldReturnCorrectIntersectionResult(Rectangle newRectangle) + { + layouter.Rectangles = Rectangles; + + return layouter.HaveIntersection(newRectangle); + } + + [Test] + public void WhenPutNewRectangles_TheyShouldBeTightlyPositioned() + { + var positions = new List() //Arrange + { + new Point(400, 400), + new Point(400, 402), + new Point(399, 398), + new Point(403, 398), + new Point(404, 400), + new Point(401, 404), + new Point(396, 401), + new Point(398, 396) + }; + + for (var i = 0; i < 8; i++) + layouter.PutNextRectangle(new Size(4, 2)); //Act + + for (var i = 0; i < positions.Count; i++) + layouter.Rectangles[i].Location.Should().Be(positions[i]); //Assert + } + } +} diff --git a/cs/TagsCloudVizuaizationTest/Properties/AssemblyInfo.cs b/cs/TagsCloudVizuaizationTest/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..c56cddf7f --- /dev/null +++ b/cs/TagsCloudVizuaizationTest/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("TagsCloudVizuaizationTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TagsCloudVizuaizationTest")] +[assembly: AssemblyCopyright("Copyright © 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("09f90167-009f-4e35-94dd-dbd7a4b6a814")] + +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/cs/TagsCloudVizuaizationTest/TagsCloudVisualizationTest.csproj b/cs/TagsCloudVizuaizationTest/TagsCloudVisualizationTest.csproj new file mode 100644 index 000000000..76ffccd33 --- /dev/null +++ b/cs/TagsCloudVizuaizationTest/TagsCloudVisualizationTest.csproj @@ -0,0 +1,100 @@ + + + + + + + + Debug + AnyCPU + {09F90167-009F-4E35-94DD-DBD7A4B6A814} + Library + Properties + TagsCloudVizuaizationTest + TagsCloudVizuaizationTest + v4.8 + 512 + {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 15.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + $(ProgramFiles)\Common Files\microsoft shared\VSTT\$(VisualStudioVersion)\UITestExtensionPackages + False + UnitTest + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\FluentAssertions.6.12.0\lib\net47\FluentAssertions.dll + + + ..\packages\MSTest.TestFramework.2.2.7\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.dll + + + ..\packages\MSTest.TestFramework.2.2.7\lib\net45\Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions.dll + + + ..\packages\NUnit.4.0.1\lib\net462\nunit.framework.dll + + + ..\packages\NUnit.4.0.1\lib\net462\nunit.framework.legacy.dll + + + + + + + + + ..\packages\System.Runtime.CompilerServices.Unsafe.4.5.0\lib\netstandard2.0\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.0\lib\netstandard2.0\System.Threading.Tasks.Extensions.dll + + + + + + + + + + + + + + + {4f909c58-0835-4f9f-ba74-9530c220d676} + TagsCloudVisualization + + + + + + + Данный проект ссылается на пакеты NuGet, отсутствующие на этом компьютере. Используйте восстановление пакетов NuGet, чтобы скачать их. Дополнительную информацию см. по адресу: http://go.microsoft.com/fwlink/?LinkID=322105. Отсутствует следующий файл: {0}. + + + + + + + + \ No newline at end of file diff --git a/cs/TagsCloudVizuaizationTest/app.config b/cs/TagsCloudVizuaizationTest/app.config new file mode 100644 index 000000000..218808e68 --- /dev/null +++ b/cs/TagsCloudVizuaizationTest/app.config @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/cs/TagsCloudVizuaizationTest/packages.config b/cs/TagsCloudVizuaizationTest/packages.config new file mode 100644 index 000000000..94e9f78fc --- /dev/null +++ b/cs/TagsCloudVizuaizationTest/packages.config @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/cs/tdd.sln b/cs/tdd.sln index c8f523d63..3e5057b5b 100644 --- a/cs/tdd.sln +++ b/cs/tdd.sln @@ -1,11 +1,18 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25123.0 +# Visual Studio Version 17 +VisualStudioVersion = 17.3.32929.385 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BowlingGame", "BowlingGame\BowlingGame.csproj", "{AD0F018A-732E-4074-8527-AB2EEC8D0BF3}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BowlingGame", "BowlingGame\BowlingGame.csproj", "{AD0F018A-732E-4074-8527-AB2EEC8D0BF3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples", "Samples\Samples.csproj", "{B5108E20-2ACF-4ED9-84FE-2A718050FC94}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples", "Samples\Samples.csproj", "{B5108E20-2ACF-4ED9-84FE-2A718050FC94}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagsCloudVisualization", "TagsCloudVisualization\TagsCloudVisualization.csproj", "{4F909C58-0835-4F9F-BA74-9530C220D676}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagsCloudVisualizationTest", "TagsCloudVizuaizationTest\TagsCloudVisualizationTest.csproj", "{09F90167-009F-4E35-94DD-DBD7A4B6A814}" + ProjectSection(ProjectDependencies) = postProject + {4F909C58-0835-4F9F-BA74-9530C220D676} = {4F909C58-0835-4F9F-BA74-9530C220D676} + EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -21,8 +28,19 @@ Global {B5108E20-2ACF-4ED9-84FE-2A718050FC94}.Debug|Any CPU.Build.0 = Debug|Any CPU {B5108E20-2ACF-4ED9-84FE-2A718050FC94}.Release|Any CPU.ActiveCfg = Release|Any CPU {B5108E20-2ACF-4ED9-84FE-2A718050FC94}.Release|Any CPU.Build.0 = Release|Any CPU + {4F909C58-0835-4F9F-BA74-9530C220D676}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4F909C58-0835-4F9F-BA74-9530C220D676}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4F909C58-0835-4F9F-BA74-9530C220D676}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4F909C58-0835-4F9F-BA74-9530C220D676}.Release|Any CPU.Build.0 = Release|Any CPU + {09F90167-009F-4E35-94DD-DBD7A4B6A814}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {09F90167-009F-4E35-94DD-DBD7A4B6A814}.Debug|Any CPU.Build.0 = Debug|Any CPU + {09F90167-009F-4E35-94DD-DBD7A4B6A814}.Release|Any CPU.ActiveCfg = Release|Any CPU + {09F90167-009F-4E35-94DD-DBD7A4B6A814}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {472B09DC-E429-4129-809C-0B19022F5F3C} + EndGlobalSection EndGlobal From 6b899db514c60b6ba3984c6221903a160b897ef4 Mon Sep 17 00:00:00 2001 From: Irina_Yatsenko Date: Tue, 5 Dec 2023 22:42:34 +0500 Subject: [PATCH 02/10] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=BF=D0=BB=D0=BE=D1=82=D0=BD=D0=BE=D0=B5=20?= =?UTF-8?q?=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B2=20=D0=BE=D0=BA=D1=80=D1=83=D0=B6=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CircularCloudLayouterTests.cs | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs b/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs index 085f447fe..0809ef626 100644 --- a/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs +++ b/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs @@ -1,4 +1,5 @@ using System; +using System.CodeDom; using System.Collections.Generic; using System.Drawing; using NUnit.Framework; @@ -37,7 +38,7 @@ public void WhenPassInvalidArguments_ShouldThrowArgumentException(int width, int public void WhenPutNewRectangle_ShouldBeAddedToList() { layouter.PutNextRectangle(new Size(4, 2)); - + layouter.Rectangles.Count.Should().Be(1); } @@ -71,23 +72,29 @@ public bool WhenPassSeveralRectangles_ShouldReturnCorrectIntersectionResult(Rect [Test] public void WhenPutNewRectangles_TheyShouldBeTightlyPositioned() { - var positions = new List() //Arrange + for (var i = 0; i < 15; i++) + layouter.PutNextRectangle(new Size(4, 2)); + + var rectanglesSquare = 0; + var radius = 0.0; + + foreach (var rectangle in layouter.Rectangles) { - new Point(400, 400), - new Point(400, 402), - new Point(399, 398), - new Point(403, 398), - new Point(404, 400), - new Point(401, 404), - new Point(396, 401), - new Point(398, 396) - }; - - for (var i = 0; i < 8; i++) - layouter.PutNextRectangle(new Size(4, 2)); //Act - - for (var i = 0; i < positions.Count; i++) - layouter.Rectangles[i].Location.Should().Be(positions[i]); //Assert + var center = layouter.Center; + + rectanglesSquare += rectangle.Size.Height * rectangle.Size.Width; + + var biggestDistance= Math.Abs(Math.Sqrt(Math.Pow(rectangle.X - center.X, 2) + + Math.Pow(rectangle.Y - center.Y, 2))); + if (biggestDistance > radius) + radius = biggestDistance; + } + + var circleSquare = Math.PI * radius * radius; + + var percentOfRatio = (rectanglesSquare / circleSquare) * 100; + + percentOfRatio.Should().BeGreaterThan(80); } } } From c26cbfc742041e7fe3ead0ffdec0b71e743fb570 Mon Sep 17 00:00:00 2001 From: Irina_Yatsenko Date: Wed, 6 Dec 2023 15:24:31 +0500 Subject: [PATCH 03/10] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D1=82=D0=B8=D0=BB=D0=B8?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85=20=D0=BE?= =?UTF-8?q?=D1=88=D0=B8=D0=B1=D0=BE=D0=BA=20=D0=B8=20=D0=BE=D0=BF=D0=B5?= =?UTF-8?q?=D1=87=D0=B0=D1=82=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CircularCloudLayouter.cs | 18 +++++++++--------- .../CircularCloudLayouterTests.cs | 17 +++++++++-------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/cs/TagsCloudVisualization/CircularCloudLayouter.cs b/cs/TagsCloudVisualization/CircularCloudLayouter.cs index d37632ef4..ec19c9455 100644 --- a/cs/TagsCloudVisualization/CircularCloudLayouter.cs +++ b/cs/TagsCloudVisualization/CircularCloudLayouter.cs @@ -9,8 +9,8 @@ public class CircularCloudLayouter : ICircularCloudLayouter { public Point Center { get; set; } public List Rectangles = new List(); - private double _angle; - private readonly int _step = 1; + private double angle; + private readonly int step = 1; public CircularCloudLayouter(Point center) { @@ -19,8 +19,7 @@ public CircularCloudLayouter(Point center) public Rectangle PutNextRectangle(Size rectangleSize) { - if (rectangleSize.Width <= 0 - || rectangleSize.Height <= 0) + if (rectangleSize.Width <= 0 || rectangleSize.Height <= 0) throw new ArgumentException(); var rectangle = new Rectangle(FindNewRectanglePosition(), rectangleSize); @@ -28,18 +27,19 @@ public Rectangle PutNextRectangle(Size rectangleSize) while (HaveIntersection(rectangle)) rectangle.Location = FindNewRectanglePosition(); Rectangles.Add(rectangle); + return rectangle; } public Point FindNewRectanglePosition(double deltaAngle = 0.1) { - _angle += deltaAngle; - var k = _step / (2 * Math.PI); - var radius = k * _angle; + angle += deltaAngle; + var k = step / (2 * Math.PI); + var radius = k * angle; var position = new Point( - Center.X + (int)(Math.Cos(_angle) * radius), - Center.Y + (int)(Math.Sin(_angle) * radius)); + Center.X + (int)(Math.Cos(angle) * radius), + Center.Y + (int)(Math.Sin(angle) * radius)); return position; } diff --git a/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs b/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs index 0809ef626..70fdd6b29 100644 --- a/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs +++ b/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs @@ -1,12 +1,11 @@ using System; -using System.CodeDom; using System.Collections.Generic; using System.Drawing; using NUnit.Framework; using TagsCloudVisualization; using FluentAssertions; -namespace TagsCloudVizualizationTest +namespace TagsCloudVisualizationTest { [TestFixture] public class CircularCloudLayouterTests @@ -14,13 +13,15 @@ public class CircularCloudLayouterTests private CircularCloudLayouter layouter; [SetUp] - public void Initial() => + public void Initial() + { layouter = new CircularCloudLayouter(new Point(400, 400)); + } [Test] public static void CircularCloudLayouterCtor_WhenPassValidArguments_DoesNotThrowException() => Assert.DoesNotThrow(() => new CircularCloudLayouter(new Point(200, 200))); - + public static TestCaseData[] InvalidArguments = { new TestCaseData(-200, 200).SetName("PassNegativeWidth"), @@ -38,7 +39,7 @@ public void WhenPassInvalidArguments_ShouldThrowArgumentException(int width, int public void WhenPutNewRectangle_ShouldBeAddedToList() { layouter.PutNextRectangle(new Size(4, 2)); - + layouter.Rectangles.Count.Should().Be(1); } @@ -84,7 +85,7 @@ public void WhenPutNewRectangles_TheyShouldBeTightlyPositioned() rectanglesSquare += rectangle.Size.Height * rectangle.Size.Width; - var biggestDistance= Math.Abs(Math.Sqrt(Math.Pow(rectangle.X - center.X, 2) + var biggestDistance = Math.Abs(Math.Sqrt(Math.Pow(rectangle.X - center.X, 2) + Math.Pow(rectangle.Y - center.Y, 2))); if (biggestDistance > radius) radius = biggestDistance; @@ -92,9 +93,9 @@ public void WhenPutNewRectangles_TheyShouldBeTightlyPositioned() var circleSquare = Math.PI * radius * radius; - var percentOfRatio = (rectanglesSquare / circleSquare) * 100; + var percentOfRatio = rectanglesSquare / circleSquare * 100; - percentOfRatio.Should().BeGreaterThan(80); + percentOfRatio.Should().BeGreaterThan(90); } } } From c30b71abd7fd7567386c3e9251ad9b3769ff9825 Mon Sep 17 00:00:00 2001 From: Irina_Yatsenko Date: Wed, 6 Dec 2023 22:09:06 +0500 Subject: [PATCH 04/10] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=BD=D0=B0=D0=B7=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B5=D0=BA=D1=82=D0=B0=20=D1=81=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CircularCloudLayouterTests.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../TagsCloudVisualizationTest.csproj | 0 .../app.config | 0 .../packages.config | 0 cs/tdd.sln | 2 +- 6 files changed, 1 insertion(+), 1 deletion(-) rename cs/{TagsCloudVizuaizationTest => TagsCloudVisualizationTest}/CircularCloudLayouterTests.cs (100%) rename cs/{TagsCloudVizuaizationTest => TagsCloudVisualizationTest}/Properties/AssemblyInfo.cs (100%) rename cs/{TagsCloudVizuaizationTest => TagsCloudVisualizationTest}/TagsCloudVisualizationTest.csproj (100%) rename cs/{TagsCloudVizuaizationTest => TagsCloudVisualizationTest}/app.config (100%) rename cs/{TagsCloudVizuaizationTest => TagsCloudVisualizationTest}/packages.config (100%) diff --git a/cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs similarity index 100% rename from cs/TagsCloudVizuaizationTest/CircularCloudLayouterTests.cs rename to cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs diff --git a/cs/TagsCloudVizuaizationTest/Properties/AssemblyInfo.cs b/cs/TagsCloudVisualizationTest/Properties/AssemblyInfo.cs similarity index 100% rename from cs/TagsCloudVizuaizationTest/Properties/AssemblyInfo.cs rename to cs/TagsCloudVisualizationTest/Properties/AssemblyInfo.cs diff --git a/cs/TagsCloudVizuaizationTest/TagsCloudVisualizationTest.csproj b/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj similarity index 100% rename from cs/TagsCloudVizuaizationTest/TagsCloudVisualizationTest.csproj rename to cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj diff --git a/cs/TagsCloudVizuaizationTest/app.config b/cs/TagsCloudVisualizationTest/app.config similarity index 100% rename from cs/TagsCloudVizuaizationTest/app.config rename to cs/TagsCloudVisualizationTest/app.config diff --git a/cs/TagsCloudVizuaizationTest/packages.config b/cs/TagsCloudVisualizationTest/packages.config similarity index 100% rename from cs/TagsCloudVizuaizationTest/packages.config rename to cs/TagsCloudVisualizationTest/packages.config diff --git a/cs/tdd.sln b/cs/tdd.sln index 3e5057b5b..6ac7711ce 100644 --- a/cs/tdd.sln +++ b/cs/tdd.sln @@ -9,7 +9,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Samples", "Samples\Samples. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagsCloudVisualization", "TagsCloudVisualization\TagsCloudVisualization.csproj", "{4F909C58-0835-4F9F-BA74-9530C220D676}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagsCloudVisualizationTest", "TagsCloudVizuaizationTest\TagsCloudVisualizationTest.csproj", "{09F90167-009F-4E35-94DD-DBD7A4B6A814}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagsCloudVisualizationTest", "TagsCloudVisualizationTest\TagsCloudVisualizationTest.csproj", "{09F90167-009F-4E35-94DD-DBD7A4B6A814}" ProjectSection(ProjectDependencies) = postProject {4F909C58-0835-4F9F-BA74-9530C220D676} = {4F909C58-0835-4F9F-BA74-9530C220D676} EndProjectSection From b0da9bd1e54fa037b5d304247267d1c6082c139e Mon Sep 17 00:00:00 2001 From: Irina_Yatsenko Date: Wed, 6 Dec 2023 22:29:40 +0500 Subject: [PATCH 05/10] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20Cloud=20=D0=B8=20?= =?UTF-8?q?=D0=BE=D1=82=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BB=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Поменяла модификаторы доступа для методов которые используются только внутри класса CircularCloudLayouter --- .../CircularCloudLayouter.cs | 27 +++++----- cs/TagsCloudVisualization/Cloud.cs | 16 ++++++ .../ICircularCloudLayouter.cs | 3 +- .../TagsCloudVisualization.csproj | 1 + .../CircularCloudLayouterTests.cs | 51 ++++++++++--------- .../Properties/AssemblyInfo.cs | 4 +- 6 files changed, 60 insertions(+), 42 deletions(-) create mode 100644 cs/TagsCloudVisualization/Cloud.cs diff --git a/cs/TagsCloudVisualization/CircularCloudLayouter.cs b/cs/TagsCloudVisualization/CircularCloudLayouter.cs index ec19c9455..503f0c082 100644 --- a/cs/TagsCloudVisualization/CircularCloudLayouter.cs +++ b/cs/TagsCloudVisualization/CircularCloudLayouter.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Drawing; using System.Linq; @@ -7,14 +6,13 @@ namespace TagsCloudVisualization { public class CircularCloudLayouter : ICircularCloudLayouter { - public Point Center { get; set; } - public List Rectangles = new List(); - private double angle; + private readonly Cloud cloud; private readonly int step = 1; + private double angle; public CircularCloudLayouter(Point center) { - Center = center; + cloud = new Cloud(center); } public Rectangle PutNextRectangle(Size rectangleSize) @@ -24,27 +22,30 @@ public Rectangle PutNextRectangle(Size rectangleSize) var rectangle = new Rectangle(FindNewRectanglePosition(), rectangleSize); - while (HaveIntersection(rectangle)) rectangle.Location = FindNewRectanglePosition(); + while (HaveIntersection(rectangle)) + { + rectangle.Location = FindNewRectanglePosition(); + } - Rectangles.Add(rectangle); + cloud.Rectangles.Add(rectangle); return rectangle; } - public Point FindNewRectanglePosition(double deltaAngle = 0.1) + private Point FindNewRectanglePosition(double deltaAngle = 0.1) { angle += deltaAngle; var k = step / (2 * Math.PI); var radius = k * angle; var position = new Point( - Center.X + (int)(Math.Cos(angle) * radius), - Center.Y + (int)(Math.Sin(angle) * radius)); + cloud.Center.X + (int)(Math.Cos(angle) * radius), + cloud.Center.Y + (int)(Math.Sin(angle) * radius)); return position; } - public bool HaveIntersection(Rectangle newRectangle) => - Rectangles.Any(rectangle => rectangle.IntersectsWith(newRectangle)); + private bool HaveIntersection(Rectangle newRectangle) => + cloud.Rectangles.Any(rectangle => rectangle.IntersectsWith(newRectangle)); } -} +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/Cloud.cs b/cs/TagsCloudVisualization/Cloud.cs new file mode 100644 index 000000000..6747c2d52 --- /dev/null +++ b/cs/TagsCloudVisualization/Cloud.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.Drawing; + +namespace TagsCloudVisualization +{ + public class Cloud + { + public Cloud(Point center) + { + Center = center; + } + + public readonly Point Center; + public List Rectangles = new List(); + } +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/ICircularCloudLayouter.cs b/cs/TagsCloudVisualization/ICircularCloudLayouter.cs index 04e856bec..8e659a7fe 100644 --- a/cs/TagsCloudVisualization/ICircularCloudLayouter.cs +++ b/cs/TagsCloudVisualization/ICircularCloudLayouter.cs @@ -4,7 +4,6 @@ namespace TagsCloudVisualization { public interface ICircularCloudLayouter { - Point Center { get; set; } Rectangle PutNextRectangle(Size rectangleSize); } -} +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj index ab115bd97..9a6bbf832 100644 --- a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj +++ b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj @@ -64,6 +64,7 @@ + diff --git a/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs index 70fdd6b29..d2be3e74a 100644 --- a/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs +++ b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Linq; using NUnit.Framework; using TagsCloudVisualization; using FluentAssertions; @@ -30,7 +31,7 @@ public static void CircularCloudLayouterCtor_WhenPassValidArguments_DoesNotThrow new TestCaseData(0, 0).SetName("PassOnlyZero") }; - [TestOf(nameof(CircularCloudLayouter.HaveIntersection))] + [TestOf(nameof(CircularCloudLayouter.PutNextRectangle))] [TestCaseSource(nameof(InvalidArguments))] public void WhenPassInvalidArguments_ShouldThrowArgumentException(int width, int height) => Assert.Throws(() => layouter.PutNextRectangle(new Size(width, height))); @@ -38,50 +39,50 @@ public void WhenPassInvalidArguments_ShouldThrowArgumentException(int width, int [Test] public void WhenPutNewRectangle_ShouldBeAddedToList() { - layouter.PutNextRectangle(new Size(4, 2)); + var currentRectangles = new List + { + layouter.PutNextRectangle(new Size(4, 2)) + }; - layouter.Rectangles.Count.Should().Be(1); + currentRectangles.Count.Should().Be(1); } - private static readonly List Rectangles = new List - { - new Rectangle(new Point(400, 400), new Size(4, 2)) - }; - public static TestCaseData[] RectanglesPosition = { - new TestCaseData(new Rectangle(new Point(400, 402), new Size(4, 2))) - .Returns(false).SetName("NotIntersectedRectangles2"), - new TestCaseData(new Rectangle(new Point(400, 402), new Size(6, 2))) - .Returns(false).SetName("NotIntersectedRectanglesOfDifferentSizes"), - - new TestCaseData(new Rectangle(new Point(400, 400), new Size(4, 2))) - .Returns(true).SetName("IntersectedRectanglesInOnePoint"), - new TestCaseData(new Rectangle(new Point(402, 400), new Size(4, 2))) - .Returns(true).SetName("IntersectedRectangles") + new TestCaseData(new Size(4, 2), new Size(4, 2)) + .Returns(false).SetName("WhenPassIdenticalRectangles"), + new TestCaseData(new Size(6, 2), new Size(4, 2)) + .Returns(false).SetName("WhenPassRectanglesOfDifferentSizes") }; - [TestOf(nameof(CircularCloudLayouter.HaveIntersection))] + [TestOf(nameof(CircularCloudLayouter.PutNextRectangle))] [TestCaseSource(nameof(RectanglesPosition))] - public bool WhenPassSeveralRectangles_ShouldReturnCorrectIntersectionResult(Rectangle newRectangle) + public bool WhenPassSeveralRectangles_ShouldReturnCorrectIntersectionResult(Size rectangleSize, + Size newRectangleSize) { - layouter.Rectangles = Rectangles; + var currentRectangles = new List + { + layouter.PutNextRectangle(rectangleSize), + layouter.PutNextRectangle(newRectangleSize) + }; - return layouter.HaveIntersection(newRectangle); + return currentRectangles.First().IntersectsWith(currentRectangles.Last()); } [Test] public void WhenPutNewRectangles_TheyShouldBeTightlyPositioned() { + var currentRectangles = new List(); + for (var i = 0; i < 15; i++) - layouter.PutNextRectangle(new Size(4, 2)); + currentRectangles.Add(layouter.PutNextRectangle(new Size(4, 2))); var rectanglesSquare = 0; var radius = 0.0; - foreach (var rectangle in layouter.Rectangles) + foreach (var rectangle in currentRectangles) { - var center = layouter.Center; + var center = new Point(400, 400); rectanglesSquare += rectangle.Size.Height * rectangle.Size.Width; @@ -98,4 +99,4 @@ public void WhenPutNewRectangles_TheyShouldBeTightlyPositioned() percentOfRatio.Should().BeGreaterThan(90); } } -} +} \ No newline at end of file diff --git a/cs/TagsCloudVisualizationTest/Properties/AssemblyInfo.cs b/cs/TagsCloudVisualizationTest/Properties/AssemblyInfo.cs index c56cddf7f..6ce97d2e9 100644 --- a/cs/TagsCloudVisualizationTest/Properties/AssemblyInfo.cs +++ b/cs/TagsCloudVisualizationTest/Properties/AssemblyInfo.cs @@ -2,11 +2,11 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -[assembly: AssemblyTitle("TagsCloudVizuaizationTest")] +[assembly: AssemblyTitle("TagsCloudVisualizationTest")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("TagsCloudVizuaizationTest")] +[assembly: AssemblyProduct("TagsCloudVisualizationTest")] [assembly: AssemblyCopyright("Copyright © 2023")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] From 3cf0fc97226b860bfac7f040b63f9564b8ab04f8 Mon Sep 17 00:00:00 2001 From: Irina_Yatsenko Date: Fri, 8 Dec 2023 00:21:57 +0500 Subject: [PATCH 06/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=20=D0=B8=20=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D1=81=20Spiral?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/BowlingGame/Game.cs | 2 +- .../CircularCloudLayouter.cs | 31 ++++++++++------- cs/TagsCloudVisualization/Cloud.cs | 2 +- .../IPointDistributor.cs | 9 +++++ cs/TagsCloudVisualization/Program.cs | 3 +- cs/TagsCloudVisualization/Spiral.cs | 25 ++++++++++++++ .../TagsCloudVisualization.csproj | 4 +++ .../CircularCloudLayouterTests.cs | 34 +++++-------------- .../TagsCloudVisualizationTest.csproj | 1 + 9 files changed, 70 insertions(+), 41 deletions(-) create mode 100644 cs/TagsCloudVisualization/IPointDistributor.cs create mode 100644 cs/TagsCloudVisualization/Spiral.cs diff --git a/cs/BowlingGame/Game.cs b/cs/BowlingGame/Game.cs index dc5704a72..30fe471a5 100644 --- a/cs/BowlingGame/Game.cs +++ b/cs/BowlingGame/Game.cs @@ -13,7 +13,7 @@ public void Roll(int pins) public int GetScore() { - throw new NotImplementedException(); + return 0; } } diff --git a/cs/TagsCloudVisualization/CircularCloudLayouter.cs b/cs/TagsCloudVisualization/CircularCloudLayouter.cs index 503f0c082..900330f7e 100644 --- a/cs/TagsCloudVisualization/CircularCloudLayouter.cs +++ b/cs/TagsCloudVisualization/CircularCloudLayouter.cs @@ -7,12 +7,12 @@ namespace TagsCloudVisualization public class CircularCloudLayouter : ICircularCloudLayouter { private readonly Cloud cloud; - private readonly int step = 1; - private double angle; + private readonly IPointDistributor distributor; - public CircularCloudLayouter(Point center) + public CircularCloudLayouter(Point center, IPointDistributor type) { cloud = new Cloud(center); + distributor = type; } public Rectangle PutNextRectangle(Size rectangleSize) @@ -20,11 +20,14 @@ public Rectangle PutNextRectangle(Size rectangleSize) if (rectangleSize.Width <= 0 || rectangleSize.Height <= 0) throw new ArgumentException(); - var rectangle = new Rectangle(FindNewRectanglePosition(), rectangleSize); + if (cloud.Rectangles.Count == 0) + return AddToCenterPosition(rectangleSize); + + var rectangle = new Rectangle(FindNewRectanglePosition(rectangleSize), rectangleSize); while (HaveIntersection(rectangle)) { - rectangle.Location = FindNewRectanglePosition(); + rectangle.Location = FindNewRectanglePosition(rectangleSize); } cloud.Rectangles.Add(rectangle); @@ -32,17 +35,19 @@ public Rectangle PutNextRectangle(Size rectangleSize) return rectangle; } - private Point FindNewRectanglePosition(double deltaAngle = 0.1) + private Rectangle AddToCenterPosition(Size rectangleSize) { - angle += deltaAngle; - var k = step / (2 * Math.PI); - var radius = k * angle; + var newRectangle = new Rectangle(new Point(cloud.Center.X - rectangleSize.Width / 2, + cloud.Center.Y - rectangleSize.Height / 2), rectangleSize); + + cloud.Rectangles.Add(newRectangle); - var position = new Point( - cloud.Center.X + (int)(Math.Cos(angle) * radius), - cloud.Center.Y + (int)(Math.Sin(angle) * radius)); + return newRectangle; + } - return position; + private Point FindNewRectanglePosition(Size rectangleSize, double deltaAngle = 0.1) + { + return distributor.GetPosition(cloud, rectangleSize, 0.1); } private bool HaveIntersection(Rectangle newRectangle) => diff --git a/cs/TagsCloudVisualization/Cloud.cs b/cs/TagsCloudVisualization/Cloud.cs index 6747c2d52..ee86b68c4 100644 --- a/cs/TagsCloudVisualization/Cloud.cs +++ b/cs/TagsCloudVisualization/Cloud.cs @@ -11,6 +11,6 @@ public Cloud(Point center) } public readonly Point Center; - public List Rectangles = new List(); + public List Rectangles = new(); } } \ No newline at end of file diff --git a/cs/TagsCloudVisualization/IPointDistributor.cs b/cs/TagsCloudVisualization/IPointDistributor.cs new file mode 100644 index 000000000..3c7b814e2 --- /dev/null +++ b/cs/TagsCloudVisualization/IPointDistributor.cs @@ -0,0 +1,9 @@ +using System.Drawing; + +namespace TagsCloudVisualization +{ + public interface IPointDistributor + { + Point GetPosition(Cloud cloud, Size rectangleSize, double deltaAngle); + } +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/Program.cs b/cs/TagsCloudVisualization/Program.cs index d4d715f5b..8c630d4cf 100644 --- a/cs/TagsCloudVisualization/Program.cs +++ b/cs/TagsCloudVisualization/Program.cs @@ -6,9 +6,10 @@ internal class Program { public const int ImageWidth = 800; public const int ImageHeight = 800; + public static void Main(string[] args) { - new CircularCloudLayouter(new Point(ImageWidth / 2, ImageHeight / 2)); + new CircularCloudLayouter(new Point(ImageWidth / 2, ImageHeight / 2), new Spiral()); } } } diff --git a/cs/TagsCloudVisualization/Spiral.cs b/cs/TagsCloudVisualization/Spiral.cs new file mode 100644 index 000000000..189852df7 --- /dev/null +++ b/cs/TagsCloudVisualization/Spiral.cs @@ -0,0 +1,25 @@ +using System; +using System.Drawing; + +namespace TagsCloudVisualization +{ + public class Spiral : IPointDistributor + { + private readonly int step = 1; + private double angle; + + public Point GetPosition(Cloud cloud, Size rectangleSize, double deltaAngle = 0.1) + { + angle += deltaAngle; + + var k = step / (2 * Math.PI); + var radius = k * angle; + + var position = new Point( + cloud.Center.X + (int)(Math.Cos(angle) * radius), + cloud.Center.Y + (int)(Math.Sin(angle) * radius)); + + return position; + } + } +} diff --git a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj index 9a6bbf832..3ccc597f4 100644 --- a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj +++ b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj @@ -26,6 +26,7 @@ DEBUG;TRACE prompt 4 + latest AnyCPU @@ -35,6 +36,7 @@ TRACE prompt 4 + latest @@ -67,8 +69,10 @@ + + diff --git a/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs index d2be3e74a..d167c8976 100644 --- a/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs +++ b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs @@ -16,12 +16,12 @@ public class CircularCloudLayouterTests [SetUp] public void Initial() { - layouter = new CircularCloudLayouter(new Point(400, 400)); + layouter = new CircularCloudLayouter(new Point(400, 400), new Spiral()); } [Test] public static void CircularCloudLayouterCtor_WhenPassValidArguments_DoesNotThrowException() => - Assert.DoesNotThrow(() => new CircularCloudLayouter(new Point(200, 200))); + Assert.DoesNotThrow(() => new CircularCloudLayouter(new Point(200, 200), new Spiral())); public static TestCaseData[] InvalidArguments = { @@ -70,33 +70,17 @@ public bool WhenPassSeveralRectangles_ShouldReturnCorrectIntersectionResult(Size } [Test] - public void WhenPutNewRectangles_TheyShouldBeTightlyPositioned() + [TestOf(nameof(CircularCloudLayouter.PutNextRectangle))] + public void WhenPassFirstPoint_ShouldBeInCenter() { - var currentRectangles = new List(); - - for (var i = 0; i < 15; i++) - currentRectangles.Add(layouter.PutNextRectangle(new Size(4, 2))); + layouter = new CircularCloudLayouter(new Point(400, 400), new Spiral()); - var rectanglesSquare = 0; - var radius = 0.0; - - foreach (var rectangle in currentRectangles) + var currentRectangles = new List() { - var center = new Point(400, 400); - - rectanglesSquare += rectangle.Size.Height * rectangle.Size.Width; - - var biggestDistance = Math.Abs(Math.Sqrt(Math.Pow(rectangle.X - center.X, 2) - + Math.Pow(rectangle.Y - center.Y, 2))); - if (biggestDistance > radius) - radius = biggestDistance; - } - - var circleSquare = Math.PI * radius * radius; - - var percentOfRatio = rectanglesSquare / circleSquare * 100; + layouter.PutNextRectangle(new Size(4,2)) + }; - percentOfRatio.Should().BeGreaterThan(90); + currentRectangles.First().Location.Should().Be(new Point(398, 399)); } } } \ No newline at end of file diff --git a/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj b/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj index 76ffccd33..393119b94 100644 --- a/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj +++ b/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj @@ -74,6 +74,7 @@ + From 76187823b5ae53ce3489d8a2b2b61135c571057d Mon Sep 17 00:00:00 2001 From: Irina_Yatsenko Date: Sat, 9 Dec 2023 03:28:22 +0500 Subject: [PATCH 07/10] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=202=20=D0=B8=203=20=D0=B7=D0=B0=D0=B4?= =?UTF-8?q?=D0=B0=D1=87=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/README.md | 5 ++ .../CircularCloudLayouter.cs | 6 +-- cs/TagsCloudVisualization/Program.cs | 4 +- cs/TagsCloudVisualization/Spiral.cs | 12 ++++- cs/TagsCloudVisualization/TagCloudCreator.cs | 20 ++++++++ .../TagsCloudVisualization.csproj | 1 + .../CircularCloudLayouterTests.cs | 50 +++++++++++++------ .../TagsCloudVisualizationTest.csproj | 1 - 8 files changed, 77 insertions(+), 22 deletions(-) create mode 100644 cs/README.md create mode 100644 cs/TagsCloudVisualization/TagCloudCreator.cs diff --git a/cs/README.md b/cs/README.md new file mode 100644 index 000000000..97c2f360b --- /dev/null +++ b/cs/README.md @@ -0,0 +1,5 @@ +![Getting Started](./TagsCloudVisualization/bin/Debug/50rectanglesR.jpg) + +![Getting Started](./TagsCloudVisualization/bin/Debug/150rectangles.jpg) + +![Getting Started](./TagsCloudVisualization/bin/Debug/500.jpg) \ No newline at end of file diff --git a/cs/TagsCloudVisualization/CircularCloudLayouter.cs b/cs/TagsCloudVisualization/CircularCloudLayouter.cs index 900330f7e..73a394ff7 100644 --- a/cs/TagsCloudVisualization/CircularCloudLayouter.cs +++ b/cs/TagsCloudVisualization/CircularCloudLayouter.cs @@ -45,10 +45,8 @@ private Rectangle AddToCenterPosition(Size rectangleSize) return newRectangle; } - private Point FindNewRectanglePosition(Size rectangleSize, double deltaAngle = 0.1) - { - return distributor.GetPosition(cloud, rectangleSize, 0.1); - } + private Point FindNewRectanglePosition(Size rectangleSize, double deltaAngle = 0.1) => + distributor.GetPosition(cloud, rectangleSize, 0.1); private bool HaveIntersection(Rectangle newRectangle) => cloud.Rectangles.Any(rectangle => rectangle.IntersectsWith(newRectangle)); diff --git a/cs/TagsCloudVisualization/Program.cs b/cs/TagsCloudVisualization/Program.cs index 8c630d4cf..36eb775a7 100644 --- a/cs/TagsCloudVisualization/Program.cs +++ b/cs/TagsCloudVisualization/Program.cs @@ -4,8 +4,8 @@ namespace TagsCloudVisualization { internal class Program { - public const int ImageWidth = 800; - public const int ImageHeight = 800; + public const int ImageWidth = 1000; + public const int ImageHeight = 1000; public static void Main(string[] args) { diff --git a/cs/TagsCloudVisualization/Spiral.cs b/cs/TagsCloudVisualization/Spiral.cs index 189852df7..f584840bd 100644 --- a/cs/TagsCloudVisualization/Spiral.cs +++ b/cs/TagsCloudVisualization/Spiral.cs @@ -5,7 +5,17 @@ namespace TagsCloudVisualization { public class Spiral : IPointDistributor { - private readonly int step = 1; + public Spiral() + { + step = 1; + } + + public Spiral(int step) + { + this.step = step; + } + + private readonly int step; private double angle; public Point GetPosition(Cloud cloud, Size rectangleSize, double deltaAngle = 0.1) diff --git a/cs/TagsCloudVisualization/TagCloudCreator.cs b/cs/TagsCloudVisualization/TagCloudCreator.cs new file mode 100644 index 000000000..6330e028d --- /dev/null +++ b/cs/TagsCloudVisualization/TagCloudCreator.cs @@ -0,0 +1,20 @@ +using System.Drawing.Imaging; +using System.Drawing; + +namespace TagsCloudVisualization +{ + public class TagCloudCreator + { + public void CreateCloud(RectangleF[] rectangles, string imageName) + { + var bitmap = new Bitmap(1000, 1000); + var graphics = Graphics.FromImage(bitmap); + var pen = new Pen(Color.Crimson); + + graphics.Clear(Color.Black); + graphics.DrawRectangles(pen, rectangles); + + bitmap.Save(imageName + ".jpg", ImageFormat.Jpeg); + } + } +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj index 3ccc597f4..ca623fdc2 100644 --- a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj +++ b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj @@ -73,6 +73,7 @@ + diff --git a/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs index d167c8976..ab9a864e1 100644 --- a/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs +++ b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs @@ -1,10 +1,13 @@ using System; -using System.Collections.Generic; using System.Drawing; using System.Linq; using NUnit.Framework; using TagsCloudVisualization; using FluentAssertions; +using NUnit.Framework.Interfaces; +using TestContext = NUnit.Framework.TestContext; +using System.IO; +using System.Reflection; namespace TagsCloudVisualizationTest { @@ -12,16 +15,36 @@ namespace TagsCloudVisualizationTest public class CircularCloudLayouterTests { private CircularCloudLayouter layouter; + private static readonly Point Center = new Point(500, 500); + private RectangleF[] currentRectangles; [SetUp] public void Initial() { - layouter = new CircularCloudLayouter(new Point(400, 400), new Spiral()); + layouter = new CircularCloudLayouter(Center, new Spiral()); + } + + [TearDown] + public void TearDown() + { + var cloudCreator = new TagCloudCreator(); + + if (currentRectangles == null) + return; + + if (TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Failed) + { + var imageName = TestContext.CurrentContext.Test.Name; + cloudCreator.CreateCloud(currentRectangles, imageName); + + var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); + Console.WriteLine($"Tag cloud visualization saved to {path}\\{imageName}"); + } } [Test] public static void CircularCloudLayouterCtor_WhenPassValidArguments_DoesNotThrowException() => - Assert.DoesNotThrow(() => new CircularCloudLayouter(new Point(200, 200), new Spiral())); + Assert.DoesNotThrow(() => new CircularCloudLayouter(Center, new Spiral())); public static TestCaseData[] InvalidArguments = { @@ -39,19 +62,19 @@ public void WhenPassInvalidArguments_ShouldThrowArgumentException(int width, int [Test] public void WhenPutNewRectangle_ShouldBeAddedToList() { - var currentRectangles = new List + currentRectangles = new RectangleF[] { - layouter.PutNextRectangle(new Size(4, 2)) + layouter.PutNextRectangle(new Size(40, 20)) }; - currentRectangles.Count.Should().Be(1); + currentRectangles.Length.Should().Be(1); } public static TestCaseData[] RectanglesPosition = { - new TestCaseData(new Size(4, 2), new Size(4, 2)) + new TestCaseData(new Size(40, 20), new Size(40, 20)) .Returns(false).SetName("WhenPassIdenticalRectangles"), - new TestCaseData(new Size(6, 2), new Size(4, 2)) + new TestCaseData(new Size(60, 20), new Size(40, 20)) .Returns(false).SetName("WhenPassRectanglesOfDifferentSizes") }; @@ -60,7 +83,7 @@ public void WhenPutNewRectangle_ShouldBeAddedToList() public bool WhenPassSeveralRectangles_ShouldReturnCorrectIntersectionResult(Size rectangleSize, Size newRectangleSize) { - var currentRectangles = new List + currentRectangles = new RectangleF[] { layouter.PutNextRectangle(rectangleSize), layouter.PutNextRectangle(newRectangleSize) @@ -73,14 +96,13 @@ public bool WhenPassSeveralRectangles_ShouldReturnCorrectIntersectionResult(Size [TestOf(nameof(CircularCloudLayouter.PutNextRectangle))] public void WhenPassFirstPoint_ShouldBeInCenter() { - layouter = new CircularCloudLayouter(new Point(400, 400), new Spiral()); - - var currentRectangles = new List() + currentRectangles = new RectangleF[] { - layouter.PutNextRectangle(new Size(4,2)) + layouter.PutNextRectangle(new Size(40,20)) }; - currentRectangles.First().Location.Should().Be(new Point(398, 399)); + currentRectangles.First().Location.X.Should().Be(480); + currentRectangles.First().Location.Y.Should().Be(490); } } } \ No newline at end of file diff --git a/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj b/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj index 393119b94..76ffccd33 100644 --- a/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj +++ b/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj @@ -74,7 +74,6 @@ - From ae07b354584e1a9f4f3ac2c0c02ac5d8a8b32d22 Mon Sep 17 00:00:00 2001 From: Irina_Yatsenko Date: Sat, 9 Dec 2023 03:32:39 +0500 Subject: [PATCH 08/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B8=D0=B7=D0=BE=D0=B1=D1=80=D0=B0?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B9=20=D0=B2=20Readme.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/README.md | 6 +++--- cs/images/150rectangles.jpg | Bin 0 -> 128449 bytes cs/images/500.jpg | Bin 0 -> 116695 bytes cs/images/50rectanglesR.jpg | Bin 0 -> 20191 bytes 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 cs/images/150rectangles.jpg create mode 100644 cs/images/500.jpg create mode 100644 cs/images/50rectanglesR.jpg diff --git a/cs/README.md b/cs/README.md index 97c2f360b..b49ec6db0 100644 --- a/cs/README.md +++ b/cs/README.md @@ -1,5 +1,5 @@ -![Getting Started](./TagsCloudVisualization/bin/Debug/50rectanglesR.jpg) +![Getting Started](./images/50rectanglesR.jpg) -![Getting Started](./TagsCloudVisualization/bin/Debug/150rectangles.jpg) +![Getting Started](./images/150rectangles.jpg) -![Getting Started](./TagsCloudVisualization/bin/Debug/500.jpg) \ No newline at end of file +![Getting Started](./images/500.jpg) \ No newline at end of file diff --git a/cs/images/150rectangles.jpg b/cs/images/150rectangles.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7f1663e85747ba182822726d7687b43d50c8e97a GIT binary patch literal 128449 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 literal 0 HcmV?d00001 diff --git a/cs/images/500.jpg b/cs/images/500.jpg new file mode 100644 index 0000000000000000000000000000000000000000..609fb69f448d6a7cb2d871fa562465b76bfcaeab GIT binary patch literal 116695 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 xpI?PmbbQ9eSk@eT`Yk&A5|#bk3jUSi5loo Date: Sat, 9 Dec 2023 22:09:42 +0500 Subject: [PATCH 09/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D0=B0=20Spiral?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CircularCloudLayouter.cs | 7 +- .../IPointDistributor.cs | 2 +- cs/TagsCloudVisualization/Spiral.cs | 21 ++++-- .../CircularCloudLayouterTests.cs | 27 +++----- cs/TagsCloudVisualizationTest/SpiralTests.cs | 64 +++++++++++++++++++ .../TagsCloudVisualizationTest.csproj | 5 +- 6 files changed, 96 insertions(+), 30 deletions(-) create mode 100644 cs/TagsCloudVisualizationTest/SpiralTests.cs diff --git a/cs/TagsCloudVisualization/CircularCloudLayouter.cs b/cs/TagsCloudVisualization/CircularCloudLayouter.cs index 73a394ff7..81593a298 100644 --- a/cs/TagsCloudVisualization/CircularCloudLayouter.cs +++ b/cs/TagsCloudVisualization/CircularCloudLayouter.cs @@ -23,11 +23,11 @@ public Rectangle PutNextRectangle(Size rectangleSize) if (cloud.Rectangles.Count == 0) return AddToCenterPosition(rectangleSize); - var rectangle = new Rectangle(FindNewRectanglePosition(rectangleSize), rectangleSize); + var rectangle = new Rectangle(distributor.GetPosition(), rectangleSize); while (HaveIntersection(rectangle)) { - rectangle.Location = FindNewRectanglePosition(rectangleSize); + rectangle.Location = distributor.GetPosition(); } cloud.Rectangles.Add(rectangle); @@ -45,9 +45,6 @@ private Rectangle AddToCenterPosition(Size rectangleSize) return newRectangle; } - private Point FindNewRectanglePosition(Size rectangleSize, double deltaAngle = 0.1) => - distributor.GetPosition(cloud, rectangleSize, 0.1); - private bool HaveIntersection(Rectangle newRectangle) => cloud.Rectangles.Any(rectangle => rectangle.IntersectsWith(newRectangle)); } diff --git a/cs/TagsCloudVisualization/IPointDistributor.cs b/cs/TagsCloudVisualization/IPointDistributor.cs index 3c7b814e2..5bef63577 100644 --- a/cs/TagsCloudVisualization/IPointDistributor.cs +++ b/cs/TagsCloudVisualization/IPointDistributor.cs @@ -4,6 +4,6 @@ namespace TagsCloudVisualization { public interface IPointDistributor { - Point GetPosition(Cloud cloud, Size rectangleSize, double deltaAngle); + Point GetPosition(); } } \ No newline at end of file diff --git a/cs/TagsCloudVisualization/Spiral.cs b/cs/TagsCloudVisualization/Spiral.cs index f584840bd..0a01050a7 100644 --- a/cs/TagsCloudVisualization/Spiral.cs +++ b/cs/TagsCloudVisualization/Spiral.cs @@ -8,26 +8,39 @@ public class Spiral : IPointDistributor public Spiral() { step = 1; + deltaAngle = 0.1; + center = new Point(0, 0); } - public Spiral(int step) + public Spiral(int step, Point center, double deltaAngle) { this.step = step; + this.center = center; + this.deltaAngle = deltaAngle; } private readonly int step; private double angle; + private readonly double deltaAngle; + private Point center; + private bool centerOnPoint; - public Point GetPosition(Cloud cloud, Size rectangleSize, double deltaAngle = 0.1) + public Point GetPosition() { + if (!centerOnPoint) + { + centerOnPoint = true; + return center; + } + angle += deltaAngle; var k = step / (2 * Math.PI); var radius = k * angle; var position = new Point( - cloud.Center.X + (int)(Math.Cos(angle) * radius), - cloud.Center.Y + (int)(Math.Sin(angle) * radius)); + center.X + (int)(Math.Cos(angle) * radius), + center.Y + (int)(Math.Sin(angle) * radius)); return position; } diff --git a/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs index ab9a864e1..31159c378 100644 --- a/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs +++ b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs @@ -14,32 +14,23 @@ namespace TagsCloudVisualizationTest [TestFixture] public class CircularCloudLayouterTests { - private CircularCloudLayouter layouter; + private CircularCloudLayouter layouter = new CircularCloudLayouter(Center, new Spiral()); private static readonly Point Center = new Point(500, 500); private RectangleF[] currentRectangles; - [SetUp] - public void Initial() - { - layouter = new CircularCloudLayouter(Center, new Spiral()); - } - [TearDown] public void TearDown() { - var cloudCreator = new TagCloudCreator(); - - if (currentRectangles == null) + if (currentRectangles == null || + TestContext.CurrentContext.Result.Outcome.Status != TestStatus.Failed) return; - if (TestContext.CurrentContext.Result.Outcome.Status == TestStatus.Failed) - { - var imageName = TestContext.CurrentContext.Test.Name; - cloudCreator.CreateCloud(currentRectangles, imageName); + var cloudCreator = new TagCloudCreator(); + var imageName = TestContext.CurrentContext.Test.Name; + cloudCreator.CreateCloud(currentRectangles, imageName); - var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); - Console.WriteLine($"Tag cloud visualization saved to {path}\\{imageName}"); - } + var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); + Console.WriteLine($"Tag cloud visualization saved to {path}\\{imageName}"); } [Test] @@ -98,7 +89,7 @@ public void WhenPassFirstPoint_ShouldBeInCenter() { currentRectangles = new RectangleF[] { - layouter.PutNextRectangle(new Size(40,20)) + layouter.PutNextRectangle(new Size(40, 20)) }; currentRectangles.First().Location.X.Should().Be(480); diff --git a/cs/TagsCloudVisualizationTest/SpiralTests.cs b/cs/TagsCloudVisualizationTest/SpiralTests.cs new file mode 100644 index 000000000..d3aec2f94 --- /dev/null +++ b/cs/TagsCloudVisualizationTest/SpiralTests.cs @@ -0,0 +1,64 @@ +using NUnit.Framework; +using System.Drawing; +using FluentAssertions; +using TagsCloudVisualization; +using System.Collections.Generic; + +namespace TagsCloudVisualizationTest +{ + [TestFixture] + public class SpiralTests + { + [Test] + [TestOf(nameof(Spiral.GetPosition))] + public void WhenPassFirstPoint_ShouldBeInCenter() + { + var spiral = new Spiral(5, new Point(0, 0), 1.5); + + var newPosition = spiral.GetPosition(); + + newPosition.Should().Be(new Point(0, 0)); + } + + public static TestCaseData[] ArgumentsForSpiralTests = + { + new TestCaseData(new Point(0, 0), new List + { + new Point(0, 0), + new Point(0, 1), + new Point(-2, 0), + new Point(0, -3), + new Point(4, -1), + new Point(2, 5), + new Point(-6, 2), + new Point(-3, -7) + }).SetName("WhenGetFewPointsFromCenter_ShouldReturnExpectedPoint"), + + new TestCaseData(new Point(-3, 2), new List() //Arrange + { + new Point(-3, 2), + new Point(-3, 3), + new Point(-5, 2), + new Point(-3, -1), + new Point(1, 1), + new Point(-1, 7), + new Point(-9, 4), + new Point(-6, -5) + }).SetName("WhenGetFewPointsFromOffsetCenter_ShouldReturnExpectedPoint") + }; + + [TestOf(nameof(Spiral.GetPosition))] + [TestCaseSource(nameof(ArgumentsForSpiralTests))] + public void WhenGetFewPoints_ShouldDrawSpiral(Point center, List expectedPoints) + { + var spiral = new Spiral(5, center, 1.5); + var actualPositions = new Point[8]; + + for (var i = 0; i < expectedPoints.Count; i++) + actualPositions[i] = spiral.GetPosition(); + + for (var i = 0; i < expectedPoints.Count; i++) + actualPositions[i].Should().Be(expectedPoints[i]); + } + } +} diff --git a/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj b/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj index 76ffccd33..16251b743 100644 --- a/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj +++ b/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj @@ -10,8 +10,8 @@ {09F90167-009F-4E35-94DD-DBD7A4B6A814} Library Properties - TagsCloudVizuaizationTest - TagsCloudVizuaizationTest + TagsCloudVisualizationTest + TagsCloudVisualizationTest v4.8 512 {3AC096D0-A1C2-E12C-1390-A8335801FDAB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} @@ -74,6 +74,7 @@ + From ee5418bade54325cc31fc90c2a8eacf6b320adbb Mon Sep 17 00:00:00 2001 From: Irina_Yatsenko Date: Tue, 12 Dec 2023 02:30:56 +0500 Subject: [PATCH 10/10] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=BC=D0=B0=D1=81=D1=88=D1=82=D0=B0=D0=B1=D0=B8?= =?UTF-8?q?=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=BC=D0=B5=D1=80=D0=BE=D0=B2=20=D0=BE=D0=B1=D0=BB=D0=B0=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=BE=D1=82=D0=BD=D0=BE=D1=81=D0=B8=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BD=D0=BE=20=D1=80=D0=B0=D0=B7=D0=BC=D0=B5=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B8=D0=B7=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CircularCloudLayouter.cs | 2 +- cs/TagsCloudVisualization/Cloud.cs | 2 +- cs/TagsCloudVisualization/TagCloudCreator.cs | 20 ---- cs/TagsCloudVisualization/TagCloudRenderer.cs | 106 ++++++++++++++++++ .../TagsCloudVisualization.csproj | 3 +- .../VisualizingSettings.cs | 28 +++++ .../CircularCloudLayouterTests.cs | 19 ++-- 7 files changed, 147 insertions(+), 33 deletions(-) delete mode 100644 cs/TagsCloudVisualization/TagCloudCreator.cs create mode 100644 cs/TagsCloudVisualization/TagCloudRenderer.cs create mode 100644 cs/TagsCloudVisualization/VisualizingSettings.cs diff --git a/cs/TagsCloudVisualization/CircularCloudLayouter.cs b/cs/TagsCloudVisualization/CircularCloudLayouter.cs index 81593a298..468c4024b 100644 --- a/cs/TagsCloudVisualization/CircularCloudLayouter.cs +++ b/cs/TagsCloudVisualization/CircularCloudLayouter.cs @@ -14,7 +14,7 @@ public CircularCloudLayouter(Point center, IPointDistributor type) cloud = new Cloud(center); distributor = type; } - + public Rectangle PutNextRectangle(Size rectangleSize) { if (rectangleSize.Width <= 0 || rectangleSize.Height <= 0) diff --git a/cs/TagsCloudVisualization/Cloud.cs b/cs/TagsCloudVisualization/Cloud.cs index ee86b68c4..97d8fc37b 100644 --- a/cs/TagsCloudVisualization/Cloud.cs +++ b/cs/TagsCloudVisualization/Cloud.cs @@ -11,6 +11,6 @@ public Cloud(Point center) } public readonly Point Center; - public List Rectangles = new(); + public readonly List Rectangles = new(); } } \ No newline at end of file diff --git a/cs/TagsCloudVisualization/TagCloudCreator.cs b/cs/TagsCloudVisualization/TagCloudCreator.cs deleted file mode 100644 index 6330e028d..000000000 --- a/cs/TagsCloudVisualization/TagCloudCreator.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Drawing.Imaging; -using System.Drawing; - -namespace TagsCloudVisualization -{ - public class TagCloudCreator - { - public void CreateCloud(RectangleF[] rectangles, string imageName) - { - var bitmap = new Bitmap(1000, 1000); - var graphics = Graphics.FromImage(bitmap); - var pen = new Pen(Color.Crimson); - - graphics.Clear(Color.Black); - graphics.DrawRectangles(pen, rectangles); - - bitmap.Save(imageName + ".jpg", ImageFormat.Jpeg); - } - } -} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/TagCloudRenderer.cs b/cs/TagsCloudVisualization/TagCloudRenderer.cs new file mode 100644 index 000000000..5fa8ad726 --- /dev/null +++ b/cs/TagsCloudVisualization/TagCloudRenderer.cs @@ -0,0 +1,106 @@ +using System; +using System.Drawing.Imaging; +using System.Drawing; +using System.Linq; + +namespace TagsCloudVisualization +{ + public class TagCloudRenderer + { + private Bitmap bitmap; + private Graphics graphics; + private Pen pen; + + public void DrawCloud(RectangleF[] rectangles, VisualizingSettings settings) + { + var smallestSizeOfRectangles = GetMinPoints(rectangles); + var unscaledImageSize = GetImageSizeWithRealSizeRectangles(rectangles, smallestSizeOfRectangles); + + if (unscaledImageSize.Height <= settings.ImageSize.Height && + unscaledImageSize.Width <= settings.ImageSize.Width) + { + bitmap = new Bitmap(settings.ImageSize.Width, settings.ImageSize.Height); + CustomizeGraphics(settings); + DrawRealSizeCloud(settings, rectangles); + return; + } + + bitmap = new Bitmap(unscaledImageSize.Width, unscaledImageSize.Height); + CustomizeGraphics(settings); + DrawScaleCloud(settings, rectangles, unscaledImageSize, smallestSizeOfRectangles); + } + + private void CustomizeGraphics(VisualizingSettings settings) + { + pen = new Pen(settings.PenColor); + graphics = Graphics.FromImage(bitmap); + graphics.Clear(settings.BackgroundColor); + } + + private void DrawScaleCloud( + VisualizingSettings settings, + RectangleF[] rectangles, + Size unscaledImageSize, + Size smallestSizeOfRectangles) + { + graphics.TranslateTransform(Math.Abs(smallestSizeOfRectangles.Width), Math.Abs(smallestSizeOfRectangles.Height)); + graphics.DrawRectangles(pen, rectangles); + + var coefficient = GetScaleCoefficients(unscaledImageSize, settings.ImageSize); + graphics.ScaleTransform(coefficient.sx, coefficient.sy); + + bitmap.Save(settings.ImageName + ".png", ImageFormat.Png); + } + + private void DrawRealSizeCloud(VisualizingSettings settings, RectangleF[] rectangles) + { + graphics.Clear(settings.BackgroundColor); + graphics.DrawRectangles(pen, rectangles); + + bitmap.Save(settings.ImageName + ".png", ImageFormat.Png); + } + + private (float sx, float sy) GetScaleCoefficients(Size unscaledImageSize, Size imageSize) + { + var sx = unscaledImageSize.Width / imageSize.Width; + var sy = unscaledImageSize.Height / imageSize.Height; + + return (sx, sy); + } + + private Size GetImageSizeWithRealSizeRectangles(RectangleF[] rectangles, Size smallestSizeOfRectangles) + { + var maxSizesOfAllRectangles = GetMaxPoints(rectangles); + + var height = maxSizesOfAllRectangles.Height - smallestSizeOfRectangles.Height + 1; + var width = maxSizesOfAllRectangles.Width - smallestSizeOfRectangles.Width + 1; + + return new Size(width, height); + } + + private Size GetMinPoints(RectangleF[] rectangles) + { + var minHeight = (int)rectangles.Select(x => x.Y).Min(); + var minWidth = (int)rectangles.Select(x => x.X).Min(); + + return new Size(minWidth, minHeight); + } + + private Size GetMaxPoints(RectangleF[] rectangles) + { + var maxHeight = float.MinValue; + var maxWidth = float.MinValue; + + foreach (var rectangle in rectangles) + { + if (rectangle.Y + rectangle.Height > maxHeight) + maxHeight = rectangle.Y + rectangle.Height; + + if (rectangle.X + rectangle.Width > maxWidth) + maxWidth = rectangle.X + rectangle.Width; + } + + return new Size((int)maxWidth, (int)maxHeight); + } + } +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj index ca623fdc2..964d4020d 100644 --- a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj +++ b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj @@ -73,7 +73,8 @@ - + + diff --git a/cs/TagsCloudVisualization/VisualizingSettings.cs b/cs/TagsCloudVisualization/VisualizingSettings.cs new file mode 100644 index 000000000..e05a06404 --- /dev/null +++ b/cs/TagsCloudVisualization/VisualizingSettings.cs @@ -0,0 +1,28 @@ +using System.Drawing; + +namespace TagsCloudVisualization +{ + public class VisualizingSettings + { + public VisualizingSettings(string imageName, Size imageSize) + { + ImageName = imageName; + ImageSize = imageSize; + BackgroundColor = Color.Black; + PenColor = Color.DarkOrange; + } + + public VisualizingSettings(string imageName, Size imageSize, Color backgroundColor, Color penColor) + { + ImageName = imageName; + ImageSize = imageSize; + BackgroundColor = backgroundColor; + PenColor = penColor; + } + + public readonly string ImageName; + public readonly Size ImageSize; + public readonly Color BackgroundColor; + public readonly Color PenColor; + } +} diff --git a/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs index 31159c378..8b3089dbc 100644 --- a/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs +++ b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs @@ -14,8 +14,8 @@ namespace TagsCloudVisualizationTest [TestFixture] public class CircularCloudLayouterTests { - private CircularCloudLayouter layouter = new CircularCloudLayouter(Center, new Spiral()); - private static readonly Point Center = new Point(500, 500); + private readonly CircularCloudLayouter layouter = new CircularCloudLayouter(Center, new Spiral()); + private static readonly Point Center = new Point(50, 50); private RectangleF[] currentRectangles; [TearDown] @@ -25,12 +25,12 @@ public void TearDown() TestContext.CurrentContext.Result.Outcome.Status != TestStatus.Failed) return; - var cloudCreator = new TagCloudCreator(); - var imageName = TestContext.CurrentContext.Test.Name; - cloudCreator.CreateCloud(currentRectangles, imageName); + var cloudCreator = new TagCloudRenderer(); + var settings = new VisualizingSettings(TestContext.CurrentContext.Test.Name, new Size(100, 100)); + cloudCreator.DrawCloud(currentRectangles, settings); var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); - Console.WriteLine($"Tag cloud visualization saved to {path}\\{imageName}"); + Console.WriteLine($"Tag cloud visualization saved to {path}\\{settings.ImageName}"); } [Test] @@ -71,8 +71,7 @@ public void WhenPutNewRectangle_ShouldBeAddedToList() [TestOf(nameof(CircularCloudLayouter.PutNextRectangle))] [TestCaseSource(nameof(RectanglesPosition))] - public bool WhenPassSeveralRectangles_ShouldReturnCorrectIntersectionResult(Size rectangleSize, - Size newRectangleSize) + public bool WhenPassSeveralRectangles_ShouldReturnCorrectIntersectionResult(Size rectangleSize, Size newRectangleSize) { currentRectangles = new RectangleF[] { @@ -92,8 +91,8 @@ public void WhenPassFirstPoint_ShouldBeInCenter() layouter.PutNextRectangle(new Size(40, 20)) }; - currentRectangles.First().Location.X.Should().Be(480); - currentRectangles.First().Location.Y.Should().Be(490); + currentRectangles.First().Location.X.Should().Be(30); + currentRectangles.First().Location.Y.Should().Be(40); } } } \ No newline at end of file