Skip to content

Нухов Руслан#271

Open
Dobvik wants to merge 12 commits into
kontur-courses:masterfrom
Dobvik:master
Open

Нухов Руслан#271
Dobvik wants to merge 12 commits into
kontur-courses:masterfrom
Dobvik:master

Conversation

@Dobvik

@Dobvik Dobvik commented Nov 27, 2025

Copy link
Copy Markdown


while (!intersectingRectangle.IsEmpty)
{
newRectangle = CreateRectangle(spiral.GetNextPoint(), rectangleSize);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Каждый раз создавать новый rectangle накладно. Можно проверять условия и без самого объекта, а только с point + size

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Поправил.

var x = (int)Math.Round(center.X + r * Math.Cos(theta));
var y = (int)Math.Round(center.Y + r * Math.Sin(theta));
yield return new Point(x, y);
theta += step;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Правильно понимаю, что поиск точки для N+1 прямоугольника начнётся удалённее от центра. чем для N? Если так, то как быть с малнькими прямоугольниками, если я уже поставил кучу больших? Для них есть место, но поиск начинается слишком далеко и они встают дальше, чем могли бы

@Dobvik Dobvik Dec 2, 2025

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Да, верно, поиск точки для N+1 прямоугольника начнётся удалённее от центра. чем для N.

Поправил. Теперь храним пройденные точки спирали, в которые можно было бы воткнуть прямоугольник.

{
while (intersectingRectangle.IsEmpty)
{
newRectangle = ShiftRectangleToCenter(newRectangle);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Не накладно ли так двигать прямоугольник на 1 и каждый раз проходить по коллекции?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

В общем случае да, но при плотном расположении точек спирали вызывалось не более 2 раз.
Я попытался как-то оптимизировать, но пока безуспешно. Не мог бы ты, что-либо посоветовать?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Можно было бы вычислять ближайшую к нему "стену" из наиболее приближенных сторон уже поставленных прямоугольников. Раз уж ты всё равно пробегаешься по коллекции, то это бы хотя бы работало за 1 прогон, а не N. Но если вызывается всего 2 раза, то может это лишний гемор, который не даст ощутимого импакта

}
}

while (!intersectingRectangle.IsEmpty)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

У тебя же по идее не может быть N раз ShiftRectangleFromCenter, тк при первом же пересечении это прервётся. Кажется достаточно 1 раз его вызвать и всё

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Поправил.

Да, это верно если точки спирали у нас довольно частые, и мы постоянно отодвигаем прямоугольники от центра.

Я писал это с такой логикой, что если мы захотели сделать точки спирали очень редкими (Большой шаг по углу, большой параметр a), тогда прямоугольники у нас скорее всего никогда не будут пересекаться, и нам постоянно придётся двигать их к центру. С другой стороны создавать такую спираль для облака не имеет смысла, так как это уже не будет похоже на спираль.


foreach (var point in freePointsSpiral)
{
if (rectangles.Any(x => x.Contains(point)))

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Кажется логичнее очищать свободные сразу после постановки нового прямоугольника. Тк именно после этого какие-то из них становятся занятыми

{
while (intersectingRectangle.IsEmpty)
{
newRectangle = ShiftRectangleToCenter(newRectangle);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Можно было бы вычислять ближайшую к нему "стену" из наиболее приближенных сторон уже поставленных прямоугольников. Раз уж ты всё равно пробегаешься по коллекции, то это бы хотя бы работало за 1 прогон, а не N. Но если вызывается всего 2 раза, то может это лишний гемор, который не даст ощутимого импакта

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants