Tengo bots en una formación rectangular con filas y columnas. Un problema surge cuando se agrega o elimina un bot de la formación. Cuando esto sucede, los bots tienen que reorganizarse para que la formación rectangular tenga aproximadamente la misma relación de aspecto y sea lo más rectangular posible. ¿Como hacer esto?
Algunas ideas:
Cuando se agrega o elimina un bot, use el nuevo número total de bots y una relación de aspecto constante deseada para calcular el nuevo ancho y alto de la formación que mejor se ajuste a esa relación de aspecto. Luego, de alguna manera, reorganice los bots para que se ajusten a las nuevas dimensiones.
Cuando se retira un bot, mueve el bot que estaba detrás de él en su lugar y continúa hasta llegar al final de la formación. Luego, incluso fuera del rango trasero tanto como sea posible barajando de alguna manera a los bots en el rango trasero.
Otra idea que es completamente diferente es imitar la forma en que las estructuras de las moléculas se mantienen juntas. Haz que cada bot quiera estar rodeado de otros cuatro bots atrayendo a los cuatro bots más cercanos y repeliendo al resto. Repele todos los bots (incluidos los cuatro) que estén demasiado cerca para garantizar la separación utilizando la ley del cuadrado inverso. También necesitaría una fuerza adicional para dar forma a toda la estructura. Pero, esto suena muy computacionalmente costoso.
ACTUALIZACIÓN : Entonces, mirando la respuesta de sarahm, se me ocurrió una buena función general que da buenas dimensiones.
Primero resolví la siguiente ecuación simultánea para ancho y alto, y luego redondeé las respuestas.
width/height=aspect ratio of your choice
width*height=number of bots
Esto le da el rectángulo entero más cercano a esa relación de aspecto para su número de bots. El rectángulo más cercano la mitad del tiempo será demasiado grande y la mitad del tiempo será demasiado pequeño (por supuesto, a veces será correcto, pero a quién le importan). En los casos en que el rectángulo es un poco demasiado grande, no necesita nada por hacer. El rango de vuelta terminará siendo casi completo, lo cual es ideal. En los casos en que el rectángulo es un poco demasiado pequeño, tienes problemas porque ese pequeño desbordamiento tendrá que ir a su propio rango creado un rango con solo unos pocos bots en él, lo que no se ve bonito. También hay casos donde la diferencia es grande(mayor que la mitad del ancho), en cuyo caso sumar o restar un rango para que la diferencia sea pequeña. Luego, cuando el rectángulo sea demasiado pequeño, agregue una columna para hacerlo un poco más grande. Después de hacer eso, parece que el rango trasero siempre tendrá al menos la mitad de los bots que los otros rangos.
ACTUALIZAR
Una vez que tenga las dimensiones, compárelas con las dimensiones actuales. Si el frente de la nueva dimensión es más grande, para cada rango, saca los bots del rango inferior y empújalos al rango actual hasta que la cantidad de bots en ese rango sea igual al frente. Continúa ese algoritmo hasta llegar al rango de atrás. Usando este algoritmo, los bots se moverán para adaptarse a la nueva dimensión de manera eficiente. Después de eso, simplemente empujo el nuevo viejo al rango de atrás. El algoritmo es ligeramente diferente para los casos en los que el nuevo frente es más pequeño, ¡pero puede resolverlo!
Hay dos problemas más a continuación. Eliminación, y un método de adición más flexible en el que los nuevos bots no se asignan necesariamente al rango de reverso sino a la posición más cercana a ellos en el momento en que se agregan.