Нухов Руслан#271
Conversation
|
|
||
| while (!intersectingRectangle.IsEmpty) | ||
| { | ||
| newRectangle = CreateRectangle(spiral.GetNextPoint(), rectangleSize); |
There was a problem hiding this comment.
Каждый раз создавать новый rectangle накладно. Можно проверять условия и без самого объекта, а только с point + size
| 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; |
There was a problem hiding this comment.
Правильно понимаю, что поиск точки для N+1 прямоугольника начнётся удалённее от центра. чем для N? Если так, то как быть с малнькими прямоугольниками, если я уже поставил кучу больших? Для них есть место, но поиск начинается слишком далеко и они встают дальше, чем могли бы
There was a problem hiding this comment.
Да, верно, поиск точки для N+1 прямоугольника начнётся удалённее от центра. чем для N.
Поправил. Теперь храним пройденные точки спирали, в которые можно было бы воткнуть прямоугольник.
| { | ||
| while (intersectingRectangle.IsEmpty) | ||
| { | ||
| newRectangle = ShiftRectangleToCenter(newRectangle); |
There was a problem hiding this comment.
Не накладно ли так двигать прямоугольник на 1 и каждый раз проходить по коллекции?
There was a problem hiding this comment.
В общем случае да, но при плотном расположении точек спирали вызывалось не более 2 раз.
Я попытался как-то оптимизировать, но пока безуспешно. Не мог бы ты, что-либо посоветовать?
There was a problem hiding this comment.
Можно было бы вычислять ближайшую к нему "стену" из наиболее приближенных сторон уже поставленных прямоугольников. Раз уж ты всё равно пробегаешься по коллекции, то это бы хотя бы работало за 1 прогон, а не N. Но если вызывается всего 2 раза, то может это лишний гемор, который не даст ощутимого импакта
| } | ||
| } | ||
|
|
||
| while (!intersectingRectangle.IsEmpty) |
There was a problem hiding this comment.
У тебя же по идее не может быть N раз ShiftRectangleFromCenter, тк при первом же пересечении это прервётся. Кажется достаточно 1 раз его вызвать и всё
There was a problem hiding this comment.
Поправил.
Да, это верно если точки спирали у нас довольно частые, и мы постоянно отодвигаем прямоугольники от центра.
Я писал это с такой логикой, что если мы захотели сделать точки спирали очень редкими (Большой шаг по углу, большой параметр a), тогда прямоугольники у нас скорее всего никогда не будут пересекаться, и нам постоянно придётся двигать их к центру. С другой стороны создавать такую спираль для облака не имеет смысла, так как это уже не будет похоже на спираль.
|
|
||
| foreach (var point in freePointsSpiral) | ||
| { | ||
| if (rectangles.Any(x => x.Contains(point))) |
There was a problem hiding this comment.
Кажется логичнее очищать свободные сразу после постановки нового прямоугольника. Тк именно после этого какие-то из них становятся занятыми
| { | ||
| while (intersectingRectangle.IsEmpty) | ||
| { | ||
| newRectangle = ShiftRectangleToCenter(newRectangle); |
There was a problem hiding this comment.
Можно было бы вычислять ближайшую к нему "стену" из наиболее приближенных сторон уже поставленных прямоугольников. Раз уж ты всё равно пробегаешься по коллекции, то это бы хотя бы работало за 1 прогон, а не N. Но если вызывается всего 2 раза, то может это лишний гемор, который не даст ощутимого импакта
@FnaTikJK