Ho dei robot in una formazione rettangolare con file e colonne. Un problema sorge quando un bot viene aggiunto o rimosso dalla formazione. Quando ciò accade, i robot devono riorganizzarsi in modo tale che la formazione rettangolare abbia ancora approssimativamente le stesse proporzioni ed sia il più rettangolare possibile. Come fare questo?
Qualche idea:
Quando un bot viene aggiunto o rimosso, utilizzare il nuovo numero totale di bot e le proporzioni costanti desiderate per calcolare la nuova larghezza e altezza della formazione che si adattano maggiormente a tali proporzioni. Quindi in qualche modo rimescola i robot per adattarli alle nuove dimensioni.
Quando un bot viene rimosso, sposta il bot che si trovava dietro di esso al suo posto e continua fino a raggiungere la fine della formazione. Quindi uniforma il rango posteriore il più possibile mescolando in qualche modo i robot nel rango posteriore.
Un'altra idea completamente diversa è quella di imitare il modo in cui le strutture molecolari stanno insieme. Fai in modo che ogni bot voglia essere circondato da altri quattro robot attirando i quattro robot più vicini e respingendo il resto. Respingi tutti i bot (inclusi i quattro) che sono troppo vicini per garantire la separazione usando la legge del quadrato inverso. Avresti anche bisogno di una forza aggiuntiva per modellare l'intera struttura. Ma questo suona molto computazionalmente costoso.
AGGIORNAMENTO : Quindi, esaminando la risposta di Sarah, ho trovato una buona funzione generale che dà buone dimensioni.
Per prima cosa ho risolto l'equazione simultanea di seguito per larghezza e altezza, quindi ho arrotondato le risposte.
width/height=aspect ratio of your choice
width*height=number of bots
Questo ti dà il rettangolo intero più vicino a quell'aspect ratio per il tuo numero di bot. Il rettangolo più vicino sarà metà del tempo troppo grande e metà del tempo troppo piccolo (ovviamente a volte sarà giusto, ma a chi importa di quelli). Nei casi in cui il rettangolo è un po ' troppo grande, non è necessario fare nulla. Il back rank finirà per essere quasi pieno, il che è l'ideale. Nei casi in cui il rettangolo è un po ' troppo piccolo, hai problemi perché quel piccolo trabocco adolescente dovrà andare al suo stesso rango creato un rango con solo pochi robot su di esso, che non sembra carino. Ci sono anche casi in cui la differenza è grande(maggiore della metà della larghezza), nel qual caso aggiungere o sottrarre un rango per ridurre la differenza. Quindi, quando il rettangolo è troppo piccolo, aggiungi una colonna per ingrandirla leggermente. Dopo aver fatto ciò, sembra che il back rank avrà sempre almeno la metà del numero di bot degli altri ranghi.
AGGIORNARE
Dopo aver ottenuto le dimensioni, confrontale con le dimensioni correnti. Se la facciata della nuova dimensione è più grande, per ogni rango, fai scoppiare i robot dal rango sottostante e spingili sul rango corrente fino a quando il numero di bots su quel rango è uguale al frontage. Continua quell'algoritmo fino a raggiungere il rango posteriore. Utilizzando questo algoritmo, i robot si sposteranno per adattarsi in modo efficiente alla nuova dimensione. Dopodiché, spingo semplicemente il nuovo vecchio sul rango posteriore. L'algoritmo è leggermente diverso per i casi in cui la nuova facciata è più piccola, ma puoi capirla!
Ci sono altri due problemi dopo. Eliminazione e un metodo di aggiunta più flessibile in cui i nuovi robot non sono necessariamente assegnati al back rank ma a seconda della posizione più vicina a loro nel momento in cui vengono aggiunti.