From d4e16edc20cf094ab2d70f579441d3cc1e063070 Mon Sep 17 00:00:00 2001 From: Anastasia Date: Tue, 5 Dec 2023 23:52:32 +0500 Subject: [PATCH 1/4] =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B=20TagsCloudVisual?= =?UTF-8?q?ization=20=D0=B8=20PointsOnSpiral?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/TagsCloudVisualization/PointsOnSpiral.cs | 28 ++++++++++++++++++ cs/TagsCloudVisualization/Program.cs | 29 +++++++++++++++++++ .../TagsCloudVisualization.csproj | 10 +++++++ cs/global.json | 7 +++++ cs/tdd.sln | 6 ++++ 5 files changed, 80 insertions(+) create mode 100644 cs/TagsCloudVisualization/PointsOnSpiral.cs create mode 100644 cs/TagsCloudVisualization/Program.cs create mode 100644 cs/TagsCloudVisualization/TagsCloudVisualization.csproj create mode 100644 cs/global.json diff --git a/cs/TagsCloudVisualization/PointsOnSpiral.cs b/cs/TagsCloudVisualization/PointsOnSpiral.cs new file mode 100644 index 000000000..0cd40a9a1 --- /dev/null +++ b/cs/TagsCloudVisualization/PointsOnSpiral.cs @@ -0,0 +1,28 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public class PointsOnSpiral +{ + private Point center; + + public PointsOnSpiral(Point center) + { + this.center = center; + } + + public IEnumerable GetPointsOnSpiral() + { + var radius = 0; + while (true) + { + for (var i = 0; i < 360; i++) + { + yield return new Point((int)(Math.Cos(2 * Math.PI * i / 360) * radius) + center.X, + (int)(Math.Sin(2 * Math.PI * i / 360) * radius) + center.Y); + } + + radius++; + } + } +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/Program.cs b/cs/TagsCloudVisualization/Program.cs new file mode 100644 index 000000000..b68515782 --- /dev/null +++ b/cs/TagsCloudVisualization/Program.cs @@ -0,0 +1,29 @@ +using System.Drawing; +using TagsCloudVisualization; + +class CircularCloudLayouter +{ + private Point cloudCenter; + private List rectangels = new List(); + private PointsOnSpiral points; + + public CircularCloudLayouter(Point cloudCenter) + { + this.cloudCenter = cloudCenter; + points = new PointsOnSpiral(cloudCenter); + } + + public Rectangle PutNextRectangle(Size rectangleSize) + { + foreach (var point in points.GetPointsOnSpiral()) + { + var rectangle = new Rectangle(point, rectangleSize); + if (rectangels.Any(x => x.IntersectsWith(rectangle))) + continue; + rectangels.Add(rectangle); + return rectangle; + } + + return new Rectangle(cloudCenter, rectangleSize); + } +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj new file mode 100644 index 000000000..9c9ef272f --- /dev/null +++ b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj @@ -0,0 +1,10 @@ + + + + Exe + net7.0 + enable + enable + + + diff --git a/cs/global.json b/cs/global.json new file mode 100644 index 000000000..dad2db5ef --- /dev/null +++ b/cs/global.json @@ -0,0 +1,7 @@ +{ + "sdk": { + "version": "8.0.0", + "rollForward": "latestMajor", + "allowPrerelease": true + } +} \ No newline at end of file diff --git a/cs/tdd.sln b/cs/tdd.sln index c8f523d63..a5ce745e8 100644 --- a/cs/tdd.sln +++ b/cs/tdd.sln @@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BowlingGame", "BowlingGame\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples", "Samples\Samples.csproj", "{B5108E20-2ACF-4ED9-84FE-2A718050FC94}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagsCloudVisualization", "TagsCloudVisualization\TagsCloudVisualization.csproj", "{21297E12-D769-413A-BDBE-7A1D2022B650}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ 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 + {21297E12-D769-413A-BDBE-7A1D2022B650}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {21297E12-D769-413A-BDBE-7A1D2022B650}.Debug|Any CPU.Build.0 = Debug|Any CPU + {21297E12-D769-413A-BDBE-7A1D2022B650}.Release|Any CPU.ActiveCfg = Release|Any CPU + {21297E12-D769-413A-BDBE-7A1D2022B650}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE From 94943ce09338fccea3d8012eac665c9a7183eb2e Mon Sep 17 00:00:00 2001 From: Anastasia Date: Mon, 11 Dec 2023 21:03:03 +0500 Subject: [PATCH 2/4] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=BD=D0=B5=D0=B4=D0=BE=D1=87=D0=B5=D1=82=D1=8B?= =?UTF-8?q?,=20=D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BB=D0=B0=20=D0=B8?= =?UTF-8?q?=D0=BD=D1=82=D0=B5=D1=80=D1=84=D0=B5=D0=B9=D1=81=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/TagsCloudVisualization/IPointsGenerator.cs | 8 ++++ .../ITagCloudLayouter.cs | 8 ++++ cs/TagsCloudVisualization/PointsOnSpiral.cs | 28 -------------- cs/TagsCloudVisualization/Program.cs | 27 ++++++++++---- .../SpiralPointsGenerator.cs | 37 +++++++++++++++++++ .../TagsCloudVisualization.csproj | 5 +++ 6 files changed, 77 insertions(+), 36 deletions(-) create mode 100644 cs/TagsCloudVisualization/IPointsGenerator.cs create mode 100644 cs/TagsCloudVisualization/ITagCloudLayouter.cs delete mode 100644 cs/TagsCloudVisualization/PointsOnSpiral.cs create mode 100644 cs/TagsCloudVisualization/SpiralPointsGenerator.cs diff --git a/cs/TagsCloudVisualization/IPointsGenerator.cs b/cs/TagsCloudVisualization/IPointsGenerator.cs new file mode 100644 index 000000000..ade75068f --- /dev/null +++ b/cs/TagsCloudVisualization/IPointsGenerator.cs @@ -0,0 +1,8 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public interface IPointsGenerator +{ + IEnumerable GetPoints(); +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/ITagCloudLayouter.cs b/cs/TagsCloudVisualization/ITagCloudLayouter.cs new file mode 100644 index 000000000..c20626054 --- /dev/null +++ b/cs/TagsCloudVisualization/ITagCloudLayouter.cs @@ -0,0 +1,8 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public interface ITagCloudLayouter +{ + Rectangle PutNextRectangle(Size rectangleSize); +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/PointsOnSpiral.cs b/cs/TagsCloudVisualization/PointsOnSpiral.cs deleted file mode 100644 index 0cd40a9a1..000000000 --- a/cs/TagsCloudVisualization/PointsOnSpiral.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System.Drawing; - -namespace TagsCloudVisualization; - -public class PointsOnSpiral -{ - private Point center; - - public PointsOnSpiral(Point center) - { - this.center = center; - } - - public IEnumerable GetPointsOnSpiral() - { - var radius = 0; - while (true) - { - for (var i = 0; i < 360; i++) - { - yield return new Point((int)(Math.Cos(2 * Math.PI * i / 360) * radius) + center.X, - (int)(Math.Sin(2 * Math.PI * i / 360) * radius) + center.Y); - } - - radius++; - } - } -} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/Program.cs b/cs/TagsCloudVisualization/Program.cs index b68515782..c668e6956 100644 --- a/cs/TagsCloudVisualization/Program.cs +++ b/cs/TagsCloudVisualization/Program.cs @@ -1,29 +1,40 @@ using System.Drawing; +using System.Collections.Generic; using TagsCloudVisualization; -class CircularCloudLayouter +public class CircularCloudLayouter : ITagCloudLayouter { - private Point cloudCenter; - private List rectangels = new List(); - private PointsOnSpiral points; + private readonly Point cloudCenter; + private readonly IList _rectangels = new List(); + private readonly SpiralPointsGenerator spiralPointsGenerator; + public CircularCloudLayouter(Point cloudCenter) { this.cloudCenter = cloudCenter; - points = new PointsOnSpiral(cloudCenter); + spiralPointsGenerator = new SpiralPointsGenerator(cloudCenter); } public Rectangle PutNextRectangle(Size rectangleSize) { - foreach (var point in points.GetPointsOnSpiral()) + foreach (var point in spiralPointsGenerator.GetPoints()) { var rectangle = new Rectangle(point, rectangleSize); - if (rectangels.Any(x => x.IntersectsWith(rectangle))) + if (_rectangels.Any(x => x.IntersectsWith(rectangle))) continue; - rectangels.Add(rectangle); + + _rectangels.Add(rectangle); return rectangle; } return new Rectangle(cloudCenter, rectangleSize); } + + static void Main(string[] args) + { + var myCenter = new Point(0, 0); + var test = new CircularCloudLayouter(myCenter); + var ans = test.spiralPointsGenerator.GetPoints().Take(100000).ToList(); + //Console.WriteLine(test.spiralPointsGenerator.GetPoints().Take(100).ToList()); + } } \ No newline at end of file diff --git a/cs/TagsCloudVisualization/SpiralPointsGenerator.cs b/cs/TagsCloudVisualization/SpiralPointsGenerator.cs new file mode 100644 index 000000000..ecf0997ab --- /dev/null +++ b/cs/TagsCloudVisualization/SpiralPointsGenerator.cs @@ -0,0 +1,37 @@ +using System.Drawing; + +namespace TagsCloudVisualization; + +public sealed class SpiralPointsGenerator : IPointsGenerator +{ + private readonly Point center; + private readonly double radiusStep; + + public SpiralPointsGenerator(Point center, double radiusStep = 1) + { + this.center = center; + this.radiusStep = radiusStep; + } + + /// + /// Long point generation operation + /// + public IEnumerable GetPoints() + { + double radius = 0; + var term = radiusStep / 360; + while (true) + { + for (var pointNumber = 0; pointNumber < 360; pointNumber++) + { + var pointAngle = 2 * Math.PI * pointNumber / 360; + // yield return new Point((int)(Math.Cos(pointAngle) * radius) + center.X, + // (int)(Math.Sin(pointAngle) * radius) + center.Y); + var currentPoint = new Point(center.X, center.Y); + currentPoint.Offset((int)(Math.Cos(pointAngle) * radius), (int)(Math.Sin(pointAngle) * radius)); + yield return currentPoint; + radius += term; + } + } + } +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj index 9c9ef272f..f1062eaac 100644 --- a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj +++ b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj @@ -7,4 +7,9 @@ enable + + + + + From 197b13d17c6534b86efd94bd2dd2d9abc686f28d Mon Sep 17 00:00:00 2001 From: Anastasia Date: Mon, 11 Dec 2023 21:27:20 +0500 Subject: [PATCH 3/4] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=BD=D0=B5=D0=B4=D0=BE=D1=87=D0=B5=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cs/TagsCloudVisualization/Program.cs | 4 ---- cs/TagsCloudVisualization/SpiralPointsGenerator.cs | 2 -- 2 files changed, 6 deletions(-) diff --git a/cs/TagsCloudVisualization/Program.cs b/cs/TagsCloudVisualization/Program.cs index c668e6956..6ee532d10 100644 --- a/cs/TagsCloudVisualization/Program.cs +++ b/cs/TagsCloudVisualization/Program.cs @@ -32,9 +32,5 @@ public Rectangle PutNextRectangle(Size rectangleSize) static void Main(string[] args) { - var myCenter = new Point(0, 0); - var test = new CircularCloudLayouter(myCenter); - var ans = test.spiralPointsGenerator.GetPoints().Take(100000).ToList(); - //Console.WriteLine(test.spiralPointsGenerator.GetPoints().Take(100).ToList()); } } \ No newline at end of file diff --git a/cs/TagsCloudVisualization/SpiralPointsGenerator.cs b/cs/TagsCloudVisualization/SpiralPointsGenerator.cs index ecf0997ab..bf294ead2 100644 --- a/cs/TagsCloudVisualization/SpiralPointsGenerator.cs +++ b/cs/TagsCloudVisualization/SpiralPointsGenerator.cs @@ -25,8 +25,6 @@ public IEnumerable GetPoints() for (var pointNumber = 0; pointNumber < 360; pointNumber++) { var pointAngle = 2 * Math.PI * pointNumber / 360; - // yield return new Point((int)(Math.Cos(pointAngle) * radius) + center.X, - // (int)(Math.Sin(pointAngle) * radius) + center.Y); var currentPoint = new Point(center.X, center.Y); currentPoint.Offset((int)(Math.Cos(pointAngle) * radius), (int)(Math.Sin(pointAngle) * radius)); yield return currentPoint; From 28eb625a2d035564dccac8a373e5abeb943cd73d Mon Sep 17 00:00:00 2001 From: Anastasia Date: Tue, 12 Dec 2023 03:20:53 +0500 Subject: [PATCH 4/4] =?UTF-8?q?=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BB=D0=B0?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=202,3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GlobalUsings.cs | 1 + .../TagCloudVisualization.Tests.csproj | 25 +++++++ cs/TagCloudVisualization.Tests/UnitTest1.cs | 67 ++++++++++++++++++ .../100(10,50)Rectangles.png | Bin 0 -> 6443 bytes .../100(randomButLesser70)Rectangles.png | Bin 0 -> 9423 bytes .../40(randomButLesser50)Rectangles.png | Bin 0 -> 4366 bytes cs/TagsCloudVisualization/CloudDrawer.cs | 17 +++++ cs/TagsCloudVisualization/README.md | 8 +++ .../TagsCloudVisualization.csproj | 6 +- cs/tdd.sln | 6 ++ 10 files changed, 129 insertions(+), 1 deletion(-) create mode 100644 cs/TagCloudVisualization.Tests/GlobalUsings.cs create mode 100644 cs/TagCloudVisualization.Tests/TagCloudVisualization.Tests.csproj create mode 100644 cs/TagCloudVisualization.Tests/UnitTest1.cs create mode 100644 cs/TagsCloudVisualization/100(10,50)Rectangles.png create mode 100644 cs/TagsCloudVisualization/100(randomButLesser70)Rectangles.png create mode 100644 cs/TagsCloudVisualization/40(randomButLesser50)Rectangles.png create mode 100644 cs/TagsCloudVisualization/CloudDrawer.cs create mode 100644 cs/TagsCloudVisualization/README.md diff --git a/cs/TagCloudVisualization.Tests/GlobalUsings.cs b/cs/TagCloudVisualization.Tests/GlobalUsings.cs new file mode 100644 index 000000000..cefced496 --- /dev/null +++ b/cs/TagCloudVisualization.Tests/GlobalUsings.cs @@ -0,0 +1 @@ +global using NUnit.Framework; \ No newline at end of file diff --git a/cs/TagCloudVisualization.Tests/TagCloudVisualization.Tests.csproj b/cs/TagCloudVisualization.Tests/TagCloudVisualization.Tests.csproj new file mode 100644 index 000000000..e2563dbf0 --- /dev/null +++ b/cs/TagCloudVisualization.Tests/TagCloudVisualization.Tests.csproj @@ -0,0 +1,25 @@ + + + + net7.0 + enable + enable + + false + true + + + + + + + + + + + + + + + + diff --git a/cs/TagCloudVisualization.Tests/UnitTest1.cs b/cs/TagCloudVisualization.Tests/UnitTest1.cs new file mode 100644 index 000000000..3c7c52383 --- /dev/null +++ b/cs/TagCloudVisualization.Tests/UnitTest1.cs @@ -0,0 +1,67 @@ +namespace TagCloudVisualization.Tests; +using System; +using System.Collections.Generic; +using System.Drawing; +using FluentAssertions; +using System.Linq; +using NUnit.Framework; +using NUnit.Framework.Interfaces; +using TagsCloudVisualization; + +[TestFixture] +public class CircularCloudLayouter_Should +{ + private CircularCloudLayouter cloud; + private Point center; + private List rectangles; + + [SetUp] + public void Setup() + { + center = new Point(250, 250); + cloud = new CircularCloudLayouter(center); + rectangles = new List(); + } + + [TearDown] + public void TearDown() + { + if (TestContext.CurrentContext.Result.Outcome.Status != TestStatus.Failed) + return; + + var path = TestContext.CurrentContext.TestDirectory + "\\" + TestContext.CurrentContext.Test.Name + ".bmp"; + CloudDrawer.DrawAndSaveCloud(rectangles.ToArray(), path); + TestContext.WriteLine("Tag cloud visualization saved to file: " + path); + } + + [Test] + public void PutNextRectangle_NoIntersects_AfterPutting() + { + var rectangleSize = new Size(10, 50); + + rectangles = new List(); + for (var i = 0; i < 100; i++) + { + rectangles.Add(cloud.PutNextRectangle(rectangleSize)); + } + + foreach (var rectangle in rectangles) + { + foreach (var secondRectangle in rectangles.Where(x => x != rectangle)) + { + rectangle.IntersectsWith(secondRectangle).Should().BeFalse(); + } + } + } + + [Test] + public void PutNextRectangle_OnCenter_AfterFirstPut() + { + var rectangleSize = new Size(100, 50); + var expectedRectangle = new Rectangle(center, rectangleSize); + var rectangle = cloud.PutNextRectangle(rectangleSize); + rectangles.Add(rectangle); + rectangle.Should().BeEquivalentTo(expectedRectangle); + } + +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/100(10,50)Rectangles.png b/cs/TagsCloudVisualization/100(10,50)Rectangles.png new file mode 100644 index 0000000000000000000000000000000000000000..5a29d3d85cd2632ee21a3f30e988b3de083d1da4 GIT binary patch literal 6443 zcmeHMe^gV~9goZ(1E#AuW-|xv5fKG8l~f`Nl**xKjDQ6KVHQ>ql2LWx01ZE0CAxX4 zU=B271R)8ur~DYUv~k%HaX!oX%fM}fuic1vim3sM3m)YJ?)b$O?~Foz4Q&3B<54vo$=U33 z$8DHIji}=Bswq+Va4#%OhYw#QIqmpXDu&^?xqdvAmisyOT;QHp2%mK8nn*A~PkR+5a645}HlXWJ;=(2)Hc#36Rq>hQBYR2jINUwB&z|o%VR^BI%hPmc(Z!Y1KNB@b#HvQ1VJN|_xMc>XN@*Xd#;U_za!!AKcHD5EiIBGd0WZC3Vn= z$vlWQ0*&V_i>fmd;dlMcsB1Th=azMvGhrp>eV|vQ8( z+hoHWW}>g=%?bK9H`<{wp!HSJ!~_}lB0E}Zm99X{ABMUwOvi0kh^EnjXj_~sH6LC2aPd==!)7*eXJFmKR9Xf0ZW_<&bDXrm1k-53XY0p z?rcXkwYUQXIz3b1XL8ki)wsIW5}MIW>M?G+PK`Qrni@e4(iW$-noXkKG8;_y3d}?e zu2eXyLAE3m0YBH-{hVyi*+-ewAn30O?R|B#jC!FTGrGX4&g9u3_wP$Dslj^57bZm^ zSH;dI6C(Y<4%%hrgbb*6@0>+^EaY3qK#0yyHD->;ohd4xKRMwmxO6mJ7P%OiRYsb9 zb!$hc_NJVea{qMrxV1+8WBVQORM*6PN^!y zo=o(8G14zbZiHK-20Asqg7E`8z0js=lS#xDtMU0pd!AEwc_Elk{q@o%*Q)uSZQw_dqb4knz5ffqgLEl551 zUQOy4TtQ|P?MSc>n15OS6lCtOR+A}xl`tmrt|V{7<2x?kjl!?I{yrAH{G?hV z@A$s`qfz+@A%DVGHdpZ6&&XtAw4WwD=S~*LEx%M&I!}J2w$PIa`J1F*5uZhikdcC- zJH4v55p3Ir63@1T0gr<)oFY}AgHBHbPZ#G#`R5&{4ya|jAaCV6nCGK)t1HE@^ldL# za!wl8*Wjox1QWKs1E-a7UWonS+xn<4=EyIkDx2BK(swyv9ZC2xFo798fJ6*(n3Tp$ zN$|9Cj!O#L{zLQyVYI(xDP!~QRvTObUm^T+CuO%Xtqt;(Kb=eZ`^FUKq}0|L++qXx zIK|h_GU&Hshr|6py{aqAJ`(zbJg(r!RedMVap7F?&Sr{O^Ll!vtsq2Appg%a*9$=m z_wk0QXgEt!2?HCn^6Si(_mwMIGVc6t%Q;&Lpq1fr)%6NeSUK1VH0=kQmUx4jvkV>z z^^$>WWS?n4kB-rlD5O(uWw4B5)@|k#dS`1R7e|l5m^ShgtI$>kfs-)y>~40(4Fx(8 z&PP;Q)rw?;VF#ZQlnHRt{hr2l0m5jaoYpw8M5ujrYw-H@HGT~L!k~I_aA%T;pW;ob!7A9 z+#KngdIy|Qt>spou+bA7Fg-`%|MoDa;;pOt80q|Xv!mDA4VJz3*~%Gy?G{+^+lV~L zw_F6Pe7jDp!LHrAR+JDbciNA)4FTthPamW>qqyE|RCl7|=Es+W16EBa;(EEeySYF4 Tk7vLi94P$TQQ<9N@BR5-aHh;V literal 0 HcmV?d00001 diff --git a/cs/TagsCloudVisualization/100(randomButLesser70)Rectangles.png b/cs/TagsCloudVisualization/100(randomButLesser70)Rectangles.png new file mode 100644 index 0000000000000000000000000000000000000000..fa44942f6038dd93185f0fffaae1b9b3715501f5 GIT binary patch literal 9423 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 literal 0 HcmV?d00001 diff --git a/cs/TagsCloudVisualization/40(randomButLesser50)Rectangles.png b/cs/TagsCloudVisualization/40(randomButLesser50)Rectangles.png new file mode 100644 index 0000000000000000000000000000000000000000..6298bce80d9dd0ba7631b2c25c432af9dac3114b GIT binary patch literal 4366 zcmeHLdr(tX8owZF@lkBr9qUN2MypKwy2Wph61>Y1V4+K^_ExbX_Tr zl{L{6!GP8nwo}B#P(n#eP)Y$YVNBXkh#@d2Gz)o{ATi{%C-RVXI_>Q2cH7zYk2`nH zchC2Izu)hC_dDm_q6BQr(nTv4K@hYQy?x702yz*BUN0;FmM*!f7~EWr?~I9t>Ljbw zVBm(^9Jd*Q>dO{eQ|E)Rd)D@(;}G;>tMhVcC;aUo1TDLQ-m-Z&IYlG8cf>dBuWl_C zN43!CihFC#vEbeNSM0svTR`sATrJrucH}OcMzjf2PG zE2G4V|D5J7`1X&|B=jtxfaZ!5e~_MQG|L1DYnd%2b^fgLv%r7aRla9e5T(&^L;KQ> zHW>Nd*KBTGMMWpq_EC0O!f&U-WqV0`PvcR*mIw&t{bbs_GiLL?kDBL7X&U@0<{?d}VD=xUZ;sd;{Q| zRmvKp@hY=V;~tn8{qq;K!Oqk(lsY0;qA#`5r2MxoC*FR8c*CMRB41v0Ru!M)x%L&z z#xJo%kwUzwHOOE=>s*1Z?ca22N&F-nc^fTCoqQ<)Ip~GzwH*l^UDDm5L)=^p>Hwho zcfj0@%L(v8&cUmtpCAofn@(-eafJwd%oIVC*_5Pu`N@?juKBZ!_}vQedXoL1aD)t&3b|$m^{{e8GkhM^^*C3z{B+SYm7mebdtkw~ zyfd>FMy-)(yu;dW$g3f3dR3irKV?Qki>motVWRITv-V!BqQ@m)o!2unR? zYJp;+@F@ZlFW%3_iZPhkH;+?i%1>YsD8u_L3IyFQQFTxm#JkUM-=UOoBYh3!<0}Uz zW$NGnAyFU!~w{2^>Ia8x4VY;L8pZLX@mQ|N187z1fBoSd$yg3is9FeA z+Q#TPmVqNipj5hfK%Xm}hs+ulg=-plq?%_HCEk9I6t9RB^jf&~1p^plY6HLKuuuP( zEh&GV9?lHxQ_31W2ov^Nk;@Yp#!I8cD+)uY`EnJMTLdp9ni@2%l{ceC36KzE;#2!3 z2F3l=k3*q%Kqh6xVT(Rf*FCxNWB}l$t!m68b4@tg(w2{Y#c9j%L0E;t6s~`J8gp#r z(Y}7+NP$oB6yfx~QrW~rgoia@S}j@T#YUcvGEfLOe}+)5JKLQhrS*^sOMZIHGhAn6 zZl|pmnR$*q{>n#>#Dfdd+<(|=ZHuQ%FyEgm=sd^ntqO}^Xq&X&8$ip@oIz8`!{f2d zL(SAC&}kY_{+huHvLN-DQSIQziMQ`*%Nq)D*lsqej_-sR!%vrb|Gx#mcB!;HyJ>X| zPP)2B*}Ap<)D;#}rZW}A_Q@t`S)g6NSMzY(lJ^>8qCx0$0JP{ne3*?^-NBByrd#L< z8Xa*TR-{6_iH{$(-1=|0U!aMyh3hze;su_d^AY!PR0I~GcpaL1YyMO4YSaFa%CsHQ z_p>%T!Dmd`#@^kB;w z{Dnxdhs8iAPZv77s=n+jh z^ONJ(DED6lJG9q>I83q;*HmL zjqEcvy$y~6193F^iT)pjvi5h+reFGIPV}@nV2b0OvHSTQHg*tjcUI+h4N1UJrQlCi zBIoWSUbuD%koLzPA;fNi?gi2suS literal 0 HcmV?d00001 diff --git a/cs/TagsCloudVisualization/CloudDrawer.cs b/cs/TagsCloudVisualization/CloudDrawer.cs new file mode 100644 index 000000000..ee451e630 --- /dev/null +++ b/cs/TagsCloudVisualization/CloudDrawer.cs @@ -0,0 +1,17 @@ +using System.Drawing; +using System.Collections.Generic; +using System.Drawing.Imaging; + +namespace TagsCloudVisualization; + +public class CloudDrawer +{ + public static void DrawAndSaveCloud(Rectangle[] rectangles, string fileName) + { + var bitmap = new Bitmap(500, 500); + var gr = Graphics.FromImage(bitmap); + gr.FillRectangle(Brushes.Black, 0, 0, 500, 500); + gr.FillRectangles(Brushes.White, rectangles); + bitmap.Save(fileName); + } +} \ No newline at end of file diff --git a/cs/TagsCloudVisualization/README.md b/cs/TagsCloudVisualization/README.md new file mode 100644 index 000000000..5f8cc76d3 --- /dev/null +++ b/cs/TagsCloudVisualization/README.md @@ -0,0 +1,8 @@ +100 квадратов со случайными размерами (максимальный размер - 70) +![TagCloud](100(randomButLesser70)Rectangles.png ) + +40 квадратов со случайными размерами (максимальный размер - 50) +![TagCloud](40(randomButLesser50)Rectangles.png ) + +100 квадратов со сторонами 10, 50 +![TagCloud](100(10,50)Rectangles.png ) \ No newline at end of file diff --git a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj index f1062eaac..ec8a30500 100644 --- a/cs/TagsCloudVisualization/TagsCloudVisualization.csproj +++ b/cs/TagsCloudVisualization/TagsCloudVisualization.csproj @@ -5,10 +5,14 @@ net7.0 enable enable + false - + + + + diff --git a/cs/tdd.sln b/cs/tdd.sln index a5ce745e8..bc2562de9 100644 --- a/cs/tdd.sln +++ b/cs/tdd.sln @@ -9,6 +9,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Samples", "Samples\Samples. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagsCloudVisualization", "TagsCloudVisualization\TagsCloudVisualization.csproj", "{21297E12-D769-413A-BDBE-7A1D2022B650}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TagCloudVisualization.Tests", "TagCloudVisualization.Tests\TagCloudVisualization.Tests.csproj", "{FCBA6AEA-59FC-4A6B-817E-5FCE66279D38}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -27,6 +29,10 @@ Global {21297E12-D769-413A-BDBE-7A1D2022B650}.Debug|Any CPU.Build.0 = Debug|Any CPU {21297E12-D769-413A-BDBE-7A1D2022B650}.Release|Any CPU.ActiveCfg = Release|Any CPU {21297E12-D769-413A-BDBE-7A1D2022B650}.Release|Any CPU.Build.0 = Release|Any CPU + {FCBA6AEA-59FC-4A6B-817E-5FCE66279D38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FCBA6AEA-59FC-4A6B-817E-5FCE66279D38}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FCBA6AEA-59FC-4A6B-817E-5FCE66279D38}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FCBA6AEA-59FC-4A6B-817E-5FCE66279D38}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE