Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Заколюкин Степан #212

Open
wants to merge 51 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
51 commits
Select commit Hold shift + click to select a range
48656d8
Создал консольный проект Облако тегов
StepanZakolukin Dec 17, 2024
babec8f
Перенес свои наработки из репозитория tdd
StepanZakolukin Dec 17, 2024
68da871
Написал класс для предобработки художественного текста
StepanZakolukin Dec 18, 2024
4b94c15
Написал модуль генерации картинки
StepanZakolukin Dec 18, 2024
2c31add
Отреформачил код
StepanZakolukin Dec 18, 2024
b3431aa
Удалил лишний метод
StepanZakolukin Dec 19, 2024
58c1e1f
Создал проект WindowsForm приложения
StepanZakolukin Dec 24, 2024
597a500
Выполнил настройку формы
StepanZakolukin Dec 24, 2024
4af1662
Написал чать GUI, добавил DI для сбора зависимостей
StepanZakolukin Dec 25, 2024
9a978c6
Поправил отображение первой колонки элементов формы и кнопок
StepanZakolukin Dec 25, 2024
dcac338
Добавил вторую колонку элементов управления на форму
StepanZakolukin Dec 25, 2024
8c52b56
Изабвился от повторов в настройке Label
StepanZakolukin Dec 25, 2024
7a360bc
Добавил отступ между элементами фильтрации
StepanZakolukin Dec 25, 2024
6d8969e
Дописал UI
StepanZakolukin Dec 26, 2024
1a486c3
Поправил косяки в GUI
StepanZakolukin Dec 26, 2024
2569e50
Поправил косяк в изменении координат при изменении размеров изоображения
StepanZakolukin Dec 27, 2024
f6a5c10
Удалил лишний проект
StepanZakolukin Dec 27, 2024
41bafeb
Удалил лишний файл
StepanZakolukin Dec 27, 2024
e09aa6b
Подкорректировал алгоритм предобраьботки текста
StepanZakolukin Dec 27, 2024
bb9ab34
Поправил визуализацию
StepanZakolukin Dec 27, 2024
920d2e7
Добавил тесты на предлбраьотку текста
StepanZakolukin Dec 27, 2024
c0d9643
Настроил рабту с mystem, так чтобы при запуске прогрпммы не появлялас…
StepanZakolukin Dec 27, 2024
8add5a0
Исправил ошибку в предобработке текста
StepanZakolukin Dec 27, 2024
95b3853
Удалил лишний проект из кода sln
StepanZakolukin Jan 4, 2025
a16dd56
Revert "Удалил лишний проект из кода sln"
StepanZakolukin Jan 4, 2025
fb1f857
Сделал Point record-ом и исправил опечатку в исключении
StepanZakolukin Jan 4, 2025
5ef9ffa
Объединил действие генерации и сохранения изоображения в одно
StepanZakolukin Jan 4, 2025
0f9a2fc
Сделал так, чтобы текст из mystem записывался в стандартный поток, а …
StepanZakolukin Jan 4, 2025
51a539f
Удалил лишний код в методе ParseText
StepanZakolukin Jan 4, 2025
8ba7752
Переименовал название некоторых классов
StepanZakolukin Jan 4, 2025
abb4479
Убрал настройки визуализации в отдельный класс
StepanZakolukin Jan 4, 2025
0795e0e
Поправил регистрацию зависимости точки центра для CircularCloud
StepanZakolukin Jan 4, 2025
0e67a79
Сделал так чтобы параметр расцветки и алгоритм формирования облака бы…
StepanZakolukin Jan 5, 2025
fea7fca
Поправил косяк с изменением размеров
StepanZakolukin Jan 5, 2025
d1d619c
Исправил ошибку
StepanZakolukin Jan 5, 2025
bc06977
Написал тесты на класс WordInfo
StepanZakolukin Jan 5, 2025
469aca6
добавил возможность выбрать структуру содержания файла
StepanZakolukin Jan 5, 2025
64aa067
Добавил тесты на случай если путь до файла не коректный и тест на пус…
StepanZakolukin Jan 5, 2025
1e3c569
Добавил тесты на метод предобработки файла со списком слов
StepanZakolukin Jan 5, 2025
b145408
Добавил точку расширения: поддержка разных форматов файлов
StepanZakolukin Jan 6, 2025
60b65ca
Поправил тесты
StepanZakolukin Jan 6, 2025
f0b3625
Добавил перенес тесты на чтение файлов, добавил один новый тест на Tx…
StepanZakolukin Jan 6, 2025
5b8d9a5
Добавил тесты на класс ReaderPicker
StepanZakolukin Jan 6, 2025
ddbe887
Добавил поддержку нескольких форматов изоображений, кроме png теперь …
StepanZakolukin Jan 6, 2025
fe860f5
Сделал так, чтобы тесты предобработки не зависили от IReader
StepanZakolukin Jan 6, 2025
9d3cbec
Добавил функционалные тесты
StepanZakolukin Jan 6, 2025
bc4377b
Исправвил ошибку
StepanZakolukin Jan 6, 2025
e4c76aa
Изменил допустимые значения коэфициента сжатия облака
StepanZakolukin Jan 6, 2025
3e50a41
Поправил функциональный тест
StepanZakolukin Jan 7, 2025
bc7f922
Добавил тест в провайдер расположения слов
StepanZakolukin Jan 7, 2025
9a681eb
Легкий рефакторинг
StepanZakolukin Jan 7, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Написал модуль генерации картинки
  • Loading branch information
StepanZakolukin committed Dec 18, 2024
commit 4b94c158882f6e11239b1d1ae49a970fc24fc334
1 change: 0 additions & 1 deletion TagCloud.Console/FilesWithTexts/input.txt

This file was deleted.

13 changes: 1 addition & 12 deletions TagCloud.Console/Program.cs
Original file line number Diff line number Diff line change
@@ -3,24 +3,13 @@
using System.Text.RegularExpressions;
using TagCloud.CloudLayout;
using TagCloud.TextProcessing;
using TagCloud.Visualization;

namespace TagCloud.Console;

internal class Program
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А почему тут постой файл. Ещё не доделал или забыл пушнуть?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Щас норм

{
private const string Path = "../../../Images";

static void Main()
{
/*var colors = new[] { Color.Red, Color.Green, Color.Brown, Color.Yellow, Color.Blue };

var visual = new VisualizationCloudLayout(800, 600, Color.White, colors);

visual.CreateImage(new CircularCloud(new Point(400, 300)), 175, new Size(30, 5), new Size(100, 25))
.Save($"{Path}/CentralСloud.png");

visual.CreateImage(new CircularCloud(new Point(250, 150)), 50, new Size(30, 5), new Size(80, 25))
.Save($"{Path}/SmalСloud.png");*/

}
}
4 changes: 4 additions & 0 deletions TagCloud.Console/TagCloud.Console.csproj
Original file line number Diff line number Diff line change
@@ -15,4 +15,8 @@
<ProjectReference Include="..\TagCloud\TagCloud.csproj" />
</ItemGroup>

<ItemGroup>
<Folder Include="FilesWithTexts\" />
</ItemGroup>

</Project>
23 changes: 9 additions & 14 deletions TagCloud.Tests/CircularCloudTests.cs
Original file line number Diff line number Diff line change
@@ -2,15 +2,14 @@
using FluentAssertions;
using NUnit.Framework.Interfaces;
using TagCloud.CloudLayout;
using TagCloud.Visualization;

namespace TagCloud.Tests;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тестов явно мало.

  1. Тесты на алгоритм проверялись в предыдущей части домашки
  2. Ожидаю, что у тебя будут тесты на все остальные абстракции, которые у тебя есть в проекте

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UP

Тестов маловато:

  1. Можно посмотреть на то, как TextPreprocessing должен вести себя в зависимости от состояния файла с словами (поломан, его нету, пустой и т.п.)
  2. Можно потестить части речи (WordInfo)
  3. Нужно побольше функциональных тестов, которые сделают всё от начала до конца в программе

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Исправил



[TestFixture]
public class CircularCloudTests
{
private readonly List<Rectangle> listRectangles = [];
private readonly List<RectangleF> listRectangles = [];

[Test]
public void CircularCloud_CorrectInitialization_NoExceptions()
@@ -25,33 +24,31 @@ public void CircularCloud_CorrectInitialization_NoExceptions()
[Test]
public void PutNextRectangle_RandomSizes_MustBeRightSize()
{
var cloud = new CircularCloud(new Point(960, 540));
var random = new Random();
var cloud = new CircularCloud(new Point(960, 540));

for (var i = 0; i < 50; i++)
{
var width = random.Next(30, 200);
var actualSize = new Size(width, random.Next(width / 6, width / 3));
var actualSize = new SizeF(width, random.Next(width / 6, width / 3));

var rectangle = cloud.PutNextRectangle(actualSize);

actualSize
.Should()
.Be(rectangle.Size);
actualSize.Should().Be(rectangle.Size);
}
}

[Test]
public void PutNextRectangle_RandomSizes_ShouldNotIntersect()
{
var cloudLayouter = new CircularCloud(new Point(960, 540));
var random = new Random();
var cloudLayouter = new CircularCloud(new Point(960, 540));

for (int i = 0; i < 100; i++)
for (var i = 0; i < 100; i++)
{
var width = random.Next(30, 200);

var rectangle = cloudLayouter.PutNextRectangle(new(width, random.Next(width / 6, width / 3)));
var rectangle = cloudLayouter.PutNextRectangle(new SizeF(width, random.Next(width / 6, width / 3)));

listRectangles.Any(rect => rect.IntersectsWith(rectangle))
.Should()
@@ -67,12 +64,10 @@ public void CreateReportInCaseOfAnError()
if (TestContext.CurrentContext.Result.Outcome == ResultState.Failure)
{
var colors = new[] { Color.Red, Color.Green, Color.Brown, Color.Yellow, Color.Blue };
var path = "../../../../TagsCloudVisualization/TestErrorReports/сloud.png";
var path = $"../../../TestErrorReports/{TestContext.CurrentContext.Test.FullName}.png";
var visual = new VisualizationCloudLayout(1920, 1080, Color.White, colors);

visual.CreateImage(listRectangles)
.Save(path);

visual.CreateImage(listRectangles).Save(path);
System.Console.WriteLine($"Tag cloud visualization saved to file {Path.GetFullPath(path)}");
}

4 changes: 4 additions & 0 deletions TagCloud.Tests/TagCloud.Tests.csproj
Original file line number Diff line number Diff line change
@@ -26,4 +26,8 @@
<ProjectReference Include="..\TagCloud.Console\TagCloud.Console.csproj" />
</ItemGroup>

<ItemGroup>
<Folder Include="TestErrorReports\" />
</ItemGroup>

</Project>
39 changes: 39 additions & 0 deletions TagCloud.Tests/VisualizationCloudLayout.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
using System.Drawing;

namespace TagCloud.Tests;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Странновато. По логике вещей эта штука должна относиться к основному проекту

+ её нужно спрятать за абстракцией


public class VisualizationCloudLayout
{
private readonly int width;
private readonly int height;
private readonly Color backgroundColor;
private readonly Color[] rectanglePalette;

public VisualizationCloudLayout(int width, int height, Color backgroundColor, IEnumerable<Color> rectanglePalette)
{
this.width = width;
this.height = height;
this.backgroundColor = backgroundColor;
this.rectanglePalette = rectanglePalette.ToArray();
}

public Bitmap CreateImage(IEnumerable<RectangleF> rectangles)
{
var image = new Bitmap(width, height);

DrawCloudLayout(Graphics.FromImage(image), rectangles);

return image;
}

private void DrawCloudLayout(Graphics graphics, IEnumerable<RectangleF> rectangles)
{
var random = new Random();
var array = rectangles.ToArray();
var color = rectanglePalette[random.Next(rectanglePalette.Length)];

graphics.FillRectangle(new SolidBrush(backgroundColor), 0, 0, width, height);
graphics.FillRectangles(new SolidBrush(color), array);
graphics.DrawRectangles(new Pen(Color.Black, 1), array);
}
}
22 changes: 11 additions & 11 deletions TagCloud/CloudLayout/CircularCloud.cs
Original file line number Diff line number Diff line change
@@ -2,14 +2,14 @@

namespace TagCloud.CloudLayout;

public class CircularCloud
public class CircularCloud : ILayoutProvider
{
private const double AngleChangeStep = Math.PI / 180;
private int DistanceBetweenTurns { get; set; }
private int InitialRadiusOfSpiral { get; set; }
private double AngleOfRotationInRadians { get; set; }

private readonly LinkedList<Rectangle> cloudOfRectangles;
private readonly LinkedList<RectangleF> cloudOfRectangles;

public readonly Point Center;

@@ -20,9 +20,9 @@ public CircularCloud(Point center)
DistanceBetweenTurns = 30;
}

public Rectangle PutNextRectangle(Size rectangleSize)
public RectangleF PutNextRectangle(SizeF rectangleSize)
{
var halfOfMinSide = Math.Min(rectangleSize.Width, rectangleSize.Height) / 2;
var halfOfMinSide = (int)(Math.Min(rectangleSize.Width, rectangleSize.Height) / 2);
DistanceBetweenTurns = Math.Min(DistanceBetweenTurns, halfOfMinSide);

if (cloudOfRectangles.Count == 0) InitialRadiusOfSpiral = halfOfMinSide;
@@ -33,7 +33,7 @@ public Rectangle PutNextRectangle(Size rectangleSize)
return rectangle;
}

private Rectangle ChooseLocationForRectangle(Size rectangleSize)
private RectangleF ChooseLocationForRectangle(SizeF rectangleSize)
{
var currentPoint = GetNewPoint();
var rectangle = GetNewRectangle(currentPoint, rectangleSize);
@@ -48,16 +48,16 @@ private Rectangle ChooseLocationForRectangle(Size rectangleSize)
return rectangle;
}

private Rectangle GetNewRectangle(Point centerPoint, Size rectangleSize) =>
new(new(centerPoint.X - rectangleSize.Width / 2,
private RectangleF GetNewRectangle(PointF centerPoint, SizeF rectangleSize) =>
new(new PointF(centerPoint.X - rectangleSize.Width / 2,
centerPoint.Y - rectangleSize.Height / 2), rectangleSize);

private Point GetNewPoint()
private PointF GetNewPoint()
{
var coefficient = InitialRadiusOfSpiral + AngleOfRotationInRadians * DistanceBetweenTurns;
var x = coefficient * Math.Cos(AngleOfRotationInRadians) + Center.X;
var y = coefficient * Math.Sin(AngleOfRotationInRadians) + Center.Y;
var x = (float)(coefficient * Math.Cos(AngleOfRotationInRadians) + Center.X);
var y = (float)(coefficient * Math.Sin(AngleOfRotationInRadians) + Center.Y);

return new((int)x, (int)y);
return new PointF(x, y);
}
}
8 changes: 8 additions & 0 deletions TagCloud/CloudLayout/ILayoutProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using System.Drawing;

namespace TagCloud.CloudLayout;

public interface ILayoutProvider
{
public RectangleF PutNextRectangle(SizeF rectangleSize);
}
9 changes: 9 additions & 0 deletions TagCloud/ImageGeneration/IColorPicker.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Drawing;
using TagCloud.TextProcessing;

namespace TagCloud;

public interface IColorPicker
{
public Color GetColorForWord(WordInfo word);
}
34 changes: 0 additions & 34 deletions TagCloud/ImageGeneration/RectangleGenerator.cs

This file was deleted.

77 changes: 42 additions & 35 deletions TagCloud/ImageGeneration/VisualizationCloudLayout.cs
Original file line number Diff line number Diff line change
@@ -1,59 +1,66 @@
using System.Drawing;
using TagCloud.CloudLayout;
using TagCloud.TextProcessing;

namespace TagCloud.Visualization;
namespace TagCloud.ImageGeneration;

public class VisualizationCloudLayout
{
private readonly int width;
private readonly int height;
private readonly Color backgroundColor;
private readonly Color[] rectanglePalette;
private readonly int numberOfWords;
private float coefficient;
private readonly IColorPicker colorPicker;
private readonly ILayoutProvider layoutProvider;
private readonly IEnumerable<WordInfo> wordsInfo;
public Size ImageSize { get; set; } = new(1080, 1080);
public FontFamily FontFamily { get; set; } = new("Arial");
public Color BackgroundColor { get; set; } = Color.Transparent;

public VisualizationCloudLayout(int width, int height, Color backgroundColor, IEnumerable<Color> rectanglePalette)
private float cloudCompressionRatio;
public float CloudCompressionRatio
{
this.width = width;
this.height = height;
this.backgroundColor = backgroundColor;
this.rectanglePalette = rectanglePalette.ToArray();
get => cloudCompressionRatio;
set
{
if (1 - value < 0.01 || value < 0.01)
throw new ArgumentException("Должно быть больше 0, номеньше или равно единице", nameof(value));

cloudCompressionRatio = value;
coefficient = ImageSize.Width * cloudCompressionRatio / numberOfWords;;
}
}

public Bitmap CreateImage(CircularCloud cloud, int amountRectangles,
Size minSize, Size maxSize)
public VisualizationCloudLayout(IColorPicker colorPicker,
ILayoutProvider layoutProvider, IEnumerable<WordInfo> words)
{
var image = new Bitmap(width, height);
var rectangles = RectangleGenerator.GenerateCloudLayout(
amountRectangles,
minSize,
maxSize,
cloud);

DrawCloudLayout(Graphics.FromImage(image), rectangles);

return image;
wordsInfo = words;
numberOfWords = words.Count();
CloudCompressionRatio = 0.8f;
this.colorPicker = colorPicker;
this.layoutProvider = layoutProvider;
}

public Bitmap CreateImage(IEnumerable<Rectangle> rectangles)
public Bitmap CreateImage(IEnumerable<WordInfo> rectangles)
{
var image = new Bitmap(width, height);

DrawCloudLayout(Graphics.FromImage(image), rectangles);
var image = new Bitmap(ImageSize.Width, ImageSize.Height);
DrawСloudOfWords(Graphics.FromImage(image));

return image;
}

private void DrawCloudLayout(Graphics graphics, IEnumerable<Rectangle> rectangles)
private void DrawСloudOfWords(Graphics graphics)
{
var random = new Random();

graphics.FillRectangle(new SolidBrush(backgroundColor), 0, 0, width, height);
// рисуем фон
graphics.FillRectangle(new SolidBrush(BackgroundColor), 0, 0, ImageSize.Width, ImageSize.Height);

foreach (var rect in rectangles)
//рисуем слова
foreach (var word in wordsInfo)
{
var color = rectanglePalette[random.Next(rectanglePalette.Length)];
var color = colorPicker.GetColorForWord(word);
var height = word.NumberInText * coefficient;
var font = new Font(FontFamily, height, GraphicsUnit.Pixel);
var size = graphics.MeasureString(word.Word, font);
var location = layoutProvider.PutNextRectangle(size);

graphics.FillRectangle(new SolidBrush(color), rect);
graphics.DrawRectangle(new Pen(Color.Black, 1), rect);
graphics.DrawString(word.Word, font, new SolidBrush(color), location);
}
}
}
2 changes: 1 addition & 1 deletion TagCloud/TagCloud.csproj
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@
</ItemGroup>

<ItemGroup>
<None Update="TextProcessing\Mystem\mystem.exe">
<None Update="TextProcessing\mystem.exe">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
8 changes: 8 additions & 0 deletions TagCloud/TextProcessing/IWordsProvider.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
using TagCloud.TextProcessing;

namespace TagCloud;

public interface IWordsProvider
{
public IEnumerable<WordInfo> PerformPreprocessing(string pathToSourceTxtFile);
}
Loading