J'ai des robots dans une formation rectangulaire avec des rangées et des colonnes. Un problème survient lorsqu'un bot est ajouté ou retiré de la formation. Lorsque cela se produit, les bots doivent se réorganiser de sorte que la formation rectangulaire soit toujours à peu près le même rapport d'aspect, et soit aussi rectangulaire que possible. Comment faire ça?
Quelques idées:
Lorsqu'un bot est ajouté ou supprimé, utilisez le nouveau nombre total de bots et le rapport d'aspect constant souhaité pour calculer la nouvelle largeur et hauteur de la formation qui correspond le mieux à ce rapport d'aspect. Ensuite, remaniez en quelque sorte les robots pour les adapter aux nouvelles dimensions.
Lorsqu'un bot est retiré, déplacez le bot qui se trouvait derrière lui à sa place et continuez jusqu'à la fin de la formation. Ensuite, égalisez le rang arrière autant que possible en mélangeant en quelque sorte les robots dans le rang arrière.
Une autre idée complètement différente consiste à imiter la façon dont les structures des molécules restent ensemble. Faites en sorte que chaque robot veuille être entouré de quatre autres robots en attirant les quatre robots les plus proches et en repoussant les autres. Repoussez tous les robots (y compris les quatre) qui sont trop proches pour assurer la séparation en utilisant la loi du carré inverse. Vous auriez également besoin d'une force supplémentaire pour façonner la structure entière. Mais cela semble très coûteux en calcul.
MISE À JOUR : Donc, en regardant la réponse de sarahm, j'ai trouvé une bonne fonction générale qui donne de bonnes dimensions.
J'ai d'abord résolu l'équation simultanée ci-dessous pour la largeur et la hauteur, puis arrondi les réponses.
width/height=aspect ratio of your choice
width*height=number of bots
Cela vous donne le rectangle entier le plus proche de ce rapport d'aspect pour votre nombre de bots. Le rectangle le plus proche sera la moitié du temps trop grand, et la moitié du temps trop petit (bien sûr, parfois, ce sera juste, mais qui s'en soucie). Dans les cas où le rectangle est un peu trop grand, rien ne doit être fait. Le dernier rang finira par être presque plein, ce qui est idéal. Dans les cas où le rectangle est un peu trop petit, vous avez eu des problèmes parce que ce minuscule débordement devra aller à son propre rang, ce qui a créé un rang avec seulement quelques bots dessus, ce qui n'est pas joli. Il y a aussi des cas où la différence est grande(plus de la moitié de la largeur), auquel cas ajoutez ou soustrayez un rang pour réduire la différence. Ensuite, lorsque le rectangle est trop petit, ajoutez une colonne pour l'agrandir un peu. Après cela, il semble que le dernier rang aura toujours au moins la moitié du nombre de robots que les autres rangs.
MISE À JOUR
Une fois que vous avez obtenu les dimensions, comparez-les aux dimensions actuelles. Si la façade de la nouvelle dimension est plus grande, pour chaque rang, sortez les bots du rang inférieur et poussez-les sur le rang actuel jusqu'à ce que le nombre de bots de ce rang soit égal à la façade. Continuez cet algorithme jusqu'à ce que vous arriviez au dernier rang. En utilisant cet algorithme, les robots se déplaceront pour s'adapter efficacement à la nouvelle dimension. Après cela, je pousse simplement le nouvel ancien au dernier rang. L'algorithme est légèrement différent pour les cas où la nouvelle façade est plus petite, mais vous pouvez le comprendre!
Il y a deux autres problèmes ensuite. Suppression, et une méthode d'addition plus flexible où les nouveaux robots ne sont pas nécessairement affectés au rang arrière, mais quelle que soit la position qui leur est la plus proche au moment où ils sont ajoutés.