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