Ich habe Bots in einer rechteckigen Formation mit Zeilen und Spalten. Ein Problem tritt auf, wenn ein Bot der Formation hinzugefügt oder daraus entfernt wird. In diesem Fall müssen sich die Bots neu anordnen, sodass die rechteckige Formation immer noch in etwa dasselbe Seitenverhältnis aufweist und so rechteckig wie möglich ist. Wie macht man das?
Einige Ideen:
Wenn ein Bot hinzugefügt oder entfernt wird, verwenden Sie die neue Gesamtzahl der Bots und ein gewünschtes konstantes Seitenverhältnis, um die neue Breite und Höhe der Formation zu berechnen, die diesem Seitenverhältnis am ehesten entspricht. Dann werden die Bots irgendwie neu gemischt, um sie an die neuen Dimensionen anzupassen.
Wenn ein Bot entfernt wird, bewegen Sie den dahinter befindlichen Bot an seinen Platz und fahren Sie fort, bis Sie das Ende der Formation erreicht haben. Dann gleichen Sie den hinteren Rang so weit wie möglich aus, indem Sie die Bots im hinteren Rang irgendwie mischen.
Eine andere Idee, die völlig anders ist, ist die Nachahmung der Art und Weise, wie Molekülstrukturen zusammenhalten. Machen Sie, dass jeder Bot von vier anderen Bots umgeben sein möchte, indem Sie die vier nächsten Bots anziehen und den Rest abwehren. Vertreibe alle Bots (einschließlich der vier), die zu nahe beieinander liegen, um eine Trennung mit dem inversen Quadratgesetz zu gewährleisten. Sie würden auch eine zusätzliche Kraft benötigen, um die gesamte Struktur zu formen. Das klingt aber sehr rechenintensiv.
UPDATE : Als ich mich also mit der Antwort von sarahm befasste, fand ich eine gute allgemeine Funktion, die gute Dimensionen ergibt.
Zuerst löste ich die unten stehende simultane Gleichung für Breite und Höhe und rundete dann die Antworten.
width/height=aspect ratio of your choice
width*height=number of bots
Dies gibt Ihnen das nächste ganzzahlige Rechteck zu diesem Seitenverhältnis für Ihre Anzahl von Bots. Das nächste Rechteck ist zur Hälfte zu groß und zur Hälfte zu klein (natürlich ist es manchmal genau richtig, aber wen interessiert das schon). In den Fällen, in denen das Rechteck etwas zu groß ist, muss nichts unternommen werden. Der hintere Rang wird fast voll sein, was ideal ist. In den Fällen, in denen das Rechteck ein wenig zu klein ist, haben Sie Probleme, weil dieser winzige Überlauf zu seinem eigenen Rang gehen muss, der einen Rang mit nur wenigen Bots erstellt hat, der nicht hübsch aussieht. Es gibt auch Fälle, in denen der Unterschied groß ist(größer als die Hälfte der Breite). In diesem Fall addieren oder subtrahieren Sie einen Rang, um den Unterschied zu verringern. Wenn das Rechteck zu klein ist, fügen Sie eine Spalte hinzu, um es nur ein bisschen größer zu machen. Danach sieht es so aus, als hätte der hintere Rang immer mindestens halb so viele Bots wie die anderen Ränge.
AKTUALISIEREN
Wenn Sie die Abmessungen erhalten haben, vergleichen Sie sie mit den aktuellen Abmessungen. Wenn die Front der neuen Dimension für jeden Rang größer ist, platzieren Sie Bots aus dem darunter liegenden Rang und verschieben Sie sie in den aktuellen Rang, bis die Anzahl der Bots in diesem Rang der Front entspricht. Setzen Sie diesen Algorithmus fort, bis Sie zum hinteren Rang gelangen. Mit diesem Algorithmus werden Bots so verschoben, dass sie effizient in die neue Dimension passen. Danach schiebe ich einfach das neue alte auf den hinteren Rang. Der Algorithmus unterscheidet sich geringfügig für die Fälle, in denen die neue Front kleiner ist, aber Sie können es herausfinden!
Es gibt zwei weitere Probleme. Löschen und flexiblere Hinzufügungsmethode, bei der neue Bots nicht unbedingt dem hinteren Rang zugewiesen werden, sondern an der Position, die ihnen zum Zeitpunkt des Hinzufügens am nächsten liegt.