У меня есть боты в прямоугольной формации с рядами и столбцами. Проблема возникает, когда бот добавляется или удаляется из пласта. Когда это происходит, боты должны перестроиться так, чтобы прямоугольная формация была примерно такой же пропорции и была настолько прямоугольной, насколько это возможно. Как это сделать?
Некоторые идеи:
Когда бот добавляется или удаляется, используйте новое общее количество ботов и желаемое постоянное соотношение сторон, чтобы вычислить новую ширину и высоту формации, которая наиболее точно соответствует этому соотношению сторон. Затем каким-то образом переставьте ботов, чтобы они соответствовали новым размерам.
Когда бот удален, переместите бот, который был позади него, на свое место и продолжайте, пока не дойдете до конца формирования. Затем выровняйте задний ранг как можно больше, перетасовав ботов в задний ранг.
Другая идея, которая совершенно отличается, состоит в том, чтобы подражать тому, как структуры молекул остаются вместе. Сделайте так, чтобы каждый бот был окружен четырьмя другими ботами, привлекая четырех ближайших ботов и отталкивая остальных. Отбросьте все боты (включая четырех), которые находятся слишком близко, чтобы обеспечить разделение, используя закон обратных квадратов. Вам также понадобится дополнительная сила для формирования всей структуры. Но это звучит очень вычислительно дорого.
ОБНОВЛЕНИЕ : Итак, изучая ответ Сарама, я придумал хорошую общую функцию, которая дает хорошие размеры.
Сначала я решил приведенное ниже уравнение для ширины и высоты, а затем округлил ответы.
width/height=aspect ratio of your choice
width*height=number of bots
Это дает вам ближайший целочисленный прямоугольник к этому соотношению сторон для вашего количества ботов. Ближайший прямоугольник будет в половине случаев слишком большим, а в половине - слишком маленьким (конечно, иногда это будет правильно, но кого это волнует). В тех случаях , когда прямоугольник представляет собой немного слишком большим, ничто не должно быть сделано. Задний ранг в итоге будет почти полным, что идеально. В тех случаях , когда прямоугольник представляет собой немного слишком мал, у вас есть проблемы , потому что маленькие крошечные переполнения придется идти в свой собственный ранг создал ранг лишь несколько ботов на нем, который не выглядит красиво. Есть также случаи, когда разница велика(больше, чем половина ширины), в этом случае добавьте или вычтите один ранг, чтобы уменьшить разницу. Затем, когда прямоугольник слишком мал, добавьте один столбец, чтобы сделать его чуть больше. После этого похоже, что у бэк-ранга всегда будет как минимум вдвое меньше ботов, чем у других.
ОБНОВИТЬ
Как только вы получили размеры, сравните их с текущими размерами. Если фасад нового измерения больше, для каждого ранга выведите попсовых ботов с ранга ниже и подталкивайте их на текущий ранг до тех пор, пока число ботов этого ранга не станет равным фронтажу. Продолжайте этот алгоритм, пока не доберетесь до заднего ранга. Используя этот алгоритм, боты будут эффективно вписываться в новое измерение. После этого я просто толкаю нового старого на задний план. Алгоритм немного отличается для случаев, когда новый фронт меньше, но вы можете это выяснить!
Далее есть еще две проблемы. Удаление и более гибкий метод сложения, при котором новые боты не обязательно присваиваются бэк-рангу, но какая позиция ближе к ним в момент их добавления.