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/README.md b/cs/README.md
new file mode 100644
index 000000000..b49ec6db0
--- /dev/null
+++ b/cs/README.md
@@ -0,0 +1,5 @@
+![Getting Started](./images/50rectanglesR.jpg)
+
+![Getting Started](./images/150rectangles.jpg)
+
+![Getting Started](./images/500.jpg)
\ No newline at end of file
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..468c4024b
--- /dev/null
+++ b/cs/TagsCloudVisualization/CircularCloudLayouter.cs
@@ -0,0 +1,51 @@
+using System;
+using System.Drawing;
+using System.Linq;
+
+namespace TagsCloudVisualization
+{
+ public class CircularCloudLayouter : ICircularCloudLayouter
+ {
+ private readonly Cloud cloud;
+ private readonly IPointDistributor distributor;
+
+ public CircularCloudLayouter(Point center, IPointDistributor type)
+ {
+ cloud = new Cloud(center);
+ distributor = type;
+ }
+
+ public Rectangle PutNextRectangle(Size rectangleSize)
+ {
+ if (rectangleSize.Width <= 0 || rectangleSize.Height <= 0)
+ throw new ArgumentException();
+
+ if (cloud.Rectangles.Count == 0)
+ return AddToCenterPosition(rectangleSize);
+
+ var rectangle = new Rectangle(distributor.GetPosition(), rectangleSize);
+
+ while (HaveIntersection(rectangle))
+ {
+ rectangle.Location = distributor.GetPosition();
+ }
+
+ cloud.Rectangles.Add(rectangle);
+
+ return rectangle;
+ }
+
+ private Rectangle AddToCenterPosition(Size rectangleSize)
+ {
+ var newRectangle = new Rectangle(new Point(cloud.Center.X - rectangleSize.Width / 2,
+ cloud.Center.Y - rectangleSize.Height / 2), rectangleSize);
+
+ cloud.Rectangles.Add(newRectangle);
+
+ return 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..97d8fc37b
--- /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 readonly List Rectangles = new();
+ }
+}
\ No newline at end of file
diff --git a/cs/TagsCloudVisualization/ICircularCloudLayouter.cs b/cs/TagsCloudVisualization/ICircularCloudLayouter.cs
new file mode 100644
index 000000000..8e659a7fe
--- /dev/null
+++ b/cs/TagsCloudVisualization/ICircularCloudLayouter.cs
@@ -0,0 +1,9 @@
+using System.Drawing;
+
+namespace TagsCloudVisualization
+{
+ public interface ICircularCloudLayouter
+ {
+ Rectangle PutNextRectangle(Size rectangleSize);
+ }
+}
\ No newline at end of file
diff --git a/cs/TagsCloudVisualization/IPointDistributor.cs b/cs/TagsCloudVisualization/IPointDistributor.cs
new file mode 100644
index 000000000..5bef63577
--- /dev/null
+++ b/cs/TagsCloudVisualization/IPointDistributor.cs
@@ -0,0 +1,9 @@
+using System.Drawing;
+
+namespace TagsCloudVisualization
+{
+ public interface IPointDistributor
+ {
+ Point GetPosition();
+ }
+}
\ No newline at end of file
diff --git a/cs/TagsCloudVisualization/Program.cs b/cs/TagsCloudVisualization/Program.cs
new file mode 100644
index 000000000..36eb775a7
--- /dev/null
+++ b/cs/TagsCloudVisualization/Program.cs
@@ -0,0 +1,15 @@
+using System.Drawing;
+
+namespace TagsCloudVisualization
+{
+ internal class Program
+ {
+ public const int ImageWidth = 1000;
+ public const int ImageHeight = 1000;
+
+ public static void Main(string[] args)
+ {
+ new CircularCloudLayouter(new Point(ImageWidth / 2, ImageHeight / 2), new Spiral());
+ }
+ }
+}
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/Spiral.cs b/cs/TagsCloudVisualization/Spiral.cs
new file mode 100644
index 000000000..0a01050a7
--- /dev/null
+++ b/cs/TagsCloudVisualization/Spiral.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Drawing;
+
+namespace TagsCloudVisualization
+{
+ public class Spiral : IPointDistributor
+ {
+ public Spiral()
+ {
+ step = 1;
+ deltaAngle = 0.1;
+ center = new Point(0, 0);
+ }
+
+ 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()
+ {
+ if (!centerOnPoint)
+ {
+ centerOnPoint = true;
+ return center;
+ }
+
+ 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;
+ }
+ }
+}
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
new file mode 100644
index 000000000..964d4020d
--- /dev/null
+++ b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj
@@ -0,0 +1,92 @@
+
+
+
+
+
+
+ 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
+ latest
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\
+ TRACE
+ prompt
+ 4
+ latest
+
+
+
+ ..\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/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/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/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs
new file mode 100644
index 000000000..8b3089dbc
--- /dev/null
+++ b/cs/TagsCloudVisualizationTest/CircularCloudLayouterTests.cs
@@ -0,0 +1,98 @@
+using System;
+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
+{
+ [TestFixture]
+ public class CircularCloudLayouterTests
+ {
+ private readonly CircularCloudLayouter layouter = new CircularCloudLayouter(Center, new Spiral());
+ private static readonly Point Center = new Point(50, 50);
+ private RectangleF[] currentRectangles;
+
+ [TearDown]
+ public void TearDown()
+ {
+ if (currentRectangles == null ||
+ TestContext.CurrentContext.Result.Outcome.Status != TestStatus.Failed)
+ return;
+
+ 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}\\{settings.ImageName}");
+ }
+
+ [Test]
+ public static void CircularCloudLayouterCtor_WhenPassValidArguments_DoesNotThrowException() =>
+ Assert.DoesNotThrow(() => new CircularCloudLayouter(Center, new Spiral()));
+
+ 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.PutNextRectangle))]
+ [TestCaseSource(nameof(InvalidArguments))]
+ public void WhenPassInvalidArguments_ShouldThrowArgumentException(int width, int height) =>
+ Assert.Throws(() => layouter.PutNextRectangle(new Size(width, height)));
+
+ [Test]
+ public void WhenPutNewRectangle_ShouldBeAddedToList()
+ {
+ currentRectangles = new RectangleF[]
+ {
+ layouter.PutNextRectangle(new Size(40, 20))
+ };
+
+ currentRectangles.Length.Should().Be(1);
+ }
+
+ public static TestCaseData[] RectanglesPosition =
+ {
+ new TestCaseData(new Size(40, 20), new Size(40, 20))
+ .Returns(false).SetName("WhenPassIdenticalRectangles"),
+ new TestCaseData(new Size(60, 20), new Size(40, 20))
+ .Returns(false).SetName("WhenPassRectanglesOfDifferentSizes")
+ };
+
+ [TestOf(nameof(CircularCloudLayouter.PutNextRectangle))]
+ [TestCaseSource(nameof(RectanglesPosition))]
+ public bool WhenPassSeveralRectangles_ShouldReturnCorrectIntersectionResult(Size rectangleSize, Size newRectangleSize)
+ {
+ currentRectangles = new RectangleF[]
+ {
+ layouter.PutNextRectangle(rectangleSize),
+ layouter.PutNextRectangle(newRectangleSize)
+ };
+
+ return currentRectangles.First().IntersectsWith(currentRectangles.Last());
+ }
+
+ [Test]
+ [TestOf(nameof(CircularCloudLayouter.PutNextRectangle))]
+ public void WhenPassFirstPoint_ShouldBeInCenter()
+ {
+ currentRectangles = new RectangleF[]
+ {
+ layouter.PutNextRectangle(new Size(40, 20))
+ };
+
+ currentRectangles.First().Location.X.Should().Be(30);
+ currentRectangles.First().Location.Y.Should().Be(40);
+ }
+ }
+}
\ No newline at end of file
diff --git a/cs/TagsCloudVisualizationTest/Properties/AssemblyInfo.cs b/cs/TagsCloudVisualizationTest/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..6ce97d2e9
--- /dev/null
+++ b/cs/TagsCloudVisualizationTest/Properties/AssemblyInfo.cs
@@ -0,0 +1,20 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
+
+[assembly: AssemblyTitle("TagsCloudVisualizationTest")]
+[assembly: AssemblyDescription("")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("")]
+[assembly: AssemblyProduct("TagsCloudVisualizationTest")]
+[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/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
new file mode 100644
index 000000000..16251b743
--- /dev/null
+++ b/cs/TagsCloudVisualizationTest/TagsCloudVisualizationTest.csproj
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+ Debug
+ AnyCPU
+ {09F90167-009F-4E35-94DD-DBD7A4B6A814}
+ Library
+ Properties
+ TagsCloudVisualizationTest
+ TagsCloudVisualizationTest
+ 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/TagsCloudVisualizationTest/app.config b/cs/TagsCloudVisualizationTest/app.config
new file mode 100644
index 000000000..218808e68
--- /dev/null
+++ b/cs/TagsCloudVisualizationTest/app.config
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cs/TagsCloudVisualizationTest/packages.config b/cs/TagsCloudVisualizationTest/packages.config
new file mode 100644
index 000000000..94e9f78fc
--- /dev/null
+++ b/cs/TagsCloudVisualizationTest/packages.config
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/cs/images/150rectangles.jpg b/cs/images/150rectangles.jpg
new file mode 100644
index 000000000..7f1663e85
Binary files /dev/null and b/cs/images/150rectangles.jpg differ
diff --git a/cs/images/500.jpg b/cs/images/500.jpg
new file mode 100644
index 000000000..609fb69f4
Binary files /dev/null and b/cs/images/500.jpg differ
diff --git a/cs/images/50rectanglesR.jpg b/cs/images/50rectanglesR.jpg
new file mode 100644
index 000000000..6565c4ad3
Binary files /dev/null and b/cs/images/50rectanglesR.jpg differ
diff --git a/cs/tdd.sln b/cs/tdd.sln
index c8f523d63..6ac7711ce 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", "TagsCloudVisualizationTest\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