-
Notifications
You must be signed in to change notification settings - Fork 276
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
using System.Drawing; | ||
|
||
namespace TagsCloudVisualization; | ||
|
||
public class PointsOnSpiral | ||
This comment has been minimized.
Sorry, something went wrong. |
||
{ | ||
private Point center; | ||
This comment has been minimized.
Sorry, something went wrong.
pakapik
|
||
|
||
public PointsOnSpiral(Point center) | ||
{ | ||
this.center = center; | ||
This comment has been minimized.
Sorry, something went wrong. |
||
} | ||
|
||
public IEnumerable<Point> GetPointsOnSpiral() | ||
This comment has been minimized.
Sorry, something went wrong.
pakapik
|
||
{ | ||
var radius = 0; | ||
This comment has been minimized.
Sorry, something went wrong.
pakapik
|
||
while (true) | ||
{ | ||
for (var i = 0; i < 360; i++) | ||
{ | ||
yield return new Point((int)(Math.Cos(2 * Math.PI * i / 360) * radius) + center.X, | ||
This comment has been minimized.
Sorry, something went wrong.
pakapik
|
||
(int)(Math.Sin(2 * Math.PI * i / 360) * radius) + center.Y); | ||
} | ||
|
||
radius++; | ||
This comment has been minimized.
Sorry, something went wrong.
pakapik
|
||
} | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
using System.Drawing; | ||
using TagsCloudVisualization; | ||
|
||
class CircularCloudLayouter | ||
This comment has been minimized.
Sorry, something went wrong.
pakapik
|
||
{ | ||
private Point cloudCenter; | ||
private List<Rectangle> rectangels = new List<Rectangle>(); | ||
This comment has been minimized.
Sorry, something went wrong.
pakapik
|
||
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()) | ||
This comment has been minimized.
Sorry, something went wrong.
pakapik
|
||
{ | ||
var rectangle = new Rectangle(point, rectangleSize); | ||
if (rectangels.Any(x => x.IntersectsWith(rectangle))) | ||
This comment has been minimized.
Sorry, something went wrong.
pakapik
|
||
continue; | ||
rectangels.Add(rectangle); | ||
This comment has been minimized.
Sorry, something went wrong.
pakapik
|
||
return rectangle; | ||
} | ||
|
||
return new Rectangle(cloudCenter, rectangleSize); | ||
This comment has been minimized.
Sorry, something went wrong.
pakapik
|
||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<Project Sdk="Microsoft.NET.Sdk"> | ||
|
||
<PropertyGroup> | ||
<OutputType>Exe</OutputType> | ||
<TargetFramework>net7.0</TargetFramework> | ||
<ImplicitUsings>enable</ImplicitUsings> | ||
<Nullable>enable</Nullable> | ||
</PropertyGroup> | ||
|
||
</Project> |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
{ | ||
"sdk": { | ||
"version": "8.0.0", | ||
"rollForward": "latestMajor", | ||
"allowPrerelease": true | ||
} | ||
} |
Делай класс запечатанным, если не предполагаешь, что от него будут наследоваться. Вообще, можешь взять за правило делать классы
sealed
всегда, но убирать только в тех случаях, когда это действительно необходимо.Это можно даже настроить в настройках среды, чтоб при создании нового класса он был
sealed
, а при отсутствии ключевого слова показывалась бы подсказка на это дело.Используя это ключевое слово, ты, во-первых, явно обозначишь, что твой класс имеет законченное поведение, во-вторых, такой код будет чуть быстрее, т.е. вместо виртуальных вызовов
callvirt
компилятор будет стараться генерироватьcall
.В первом случае используется полиморфный способ вызова, и
CLR
в рантайме каждый раз определяет тип, который вызывает метод (потому что вдруг кто-то переопределил поведение?).Во втором случае, т.к. класс
sealed
, т.е. точно не имеет никаких иных переопределений, вызов метода будет происходить через командуcall
- сразу из памяти дернется метод.