Saya punya bot dalam formasi persegi panjang dengan baris dan kolom. Masalah muncul ketika bot ditambahkan atau dihapus dari formasi. Ketika ini terjadi, bot harus mengatur ulang diri mereka sendiri sehingga formasi segi empat masih kira-kira sama dengan aspek rasio, dan selebar mungkin. Bagaimana cara melakukannya?
Beberapa ide:
Ketika bot ditambahkan atau dihapus, gunakan jumlah bot baru dan rasio aspek konstan yang diinginkan untuk menghitung lebar dan tinggi formasi baru yang paling cocok dengan rasio aspek tersebut. Lalu, entah bagaimana atur ulang bot agar sesuai dengan dimensi baru.
Ketika bot dihapus, pindahkan bot yang berada di belakangnya ke tempatnya, dan lanjutkan sampai Anda mencapai akhir formasi. Kemudian meratakan peringkat belakang sebanyak mungkin dengan mengacak-acak bot di peringkat belakang.
Gagasan lain yang sama sekali berbeda adalah meniru cara struktur molekul tetap bersama. Buat setiap bot ingin dikelilingi oleh empat bot lain dengan menarik empat bot terdekat, dan tolak sisanya. Tolak semua bot (termasuk empat) yang terlalu dekat untuk memastikan pemisahan menggunakan hukum kuadrat terbalik. Anda juga membutuhkan kekuatan tambahan untuk membentuk seluruh struktur. Tapi, ini terdengar sangat mahal secara komputasi.
UPDATE : Jadi melihat ke jawaban sarahm, saya datang dengan fungsi umum yang bagus yang memberikan dimensi yang baik.
Pertama saya memecahkan persamaan simultan di bawah ini untuk lebar dan tinggi, dan kemudian membulatkan jawaban.
width/height=aspect ratio of your choice
width*height=number of bots
Ini memberi Anda persegi bilangan bulat terdekat dengan rasio aspek untuk jumlah bot Anda. Kotak terdekat akan separuh waktu menjadi terlalu besar, dan separuh waktu menjadi terlalu kecil (tentu saja kadang-kadang akan tepat tetapi siapa yang peduli tentang itu). Dalam kasus di mana persegi panjang agak terlalu besar, tidak ada yang perlu dilakukan. Peringkat belakang hanya akan berakhir menjadi hampir penuh, yang ideal. Dalam kasus di mana persegi panjang agak terlalu kecil, Anda punya masalah karena luapan kecil mungil harus pergi ke peringkat sendiri menciptakan peringkat dengan hanya beberapa bot di atasnya, yang tidak terlihat cantik. Ada juga kasus di mana perbedaannya besar(lebih besar dari setengah lebar), dalam hal ini menambah atau mengurangi satu peringkat untuk membuat perbedaan kecil. Kemudian, ketika persegi panjang terlalu kecil, tambahkan satu kolom untuk membuatnya sedikit lebih besar. Setelah melakukan itu sepertinya peringkat belakang akan selalu memiliki setidaknya setengah bot sebanyak peringkat lainnya.
MEMPERBARUI
Setelah Anda mendapatkan dimensi, bandingkan dengan dimensi saat ini. Jika bagian depan dimensi baru lebih besar, untuk setiap peringkat, letakan bot dari peringkat di bawah, dan dorong mereka ke peringkat saat ini hingga jumlah bot di peringkat itu sama dengan bagian depan. Lanjutkan algoritma itu sampai Anda mencapai peringkat belakang. Dengan menggunakan algoritma ini, bot akan bergerak agar sesuai dengan dimensi baru secara efisien. Setelah itu, saya hanya mendorong yang lama ke peringkat belakang. Algoritma ini sedikit berbeda untuk kasus-kasus di mana bagian depan yang baru lebih kecil, tetapi Anda dapat mengetahuinya!
Ada dua masalah lagi selanjutnya. Penghapusan, dan metode penambahan yang lebih fleksibel di mana bot baru tidak harus ditetapkan ke peringkat belakang tetapi posisi mana pun yang paling dekat dengan mereka saat mereka ditambahkan.