Sıralar ve sütunlarla dikdörtgen bir formasyonda botlar var. Bir bot formasyon eklendiğinde veya oluşumdan çıkarıldığında bir sorun ortaya çıkar. Bu olduğunda, botlar kendilerini dikdörtgen şeklindeki oluşum hala kabaca aynı en boy oranı olacak ve mümkün olduğunca dikdörtgen olacak şekilde yeniden düzenlemelidir . Bu nasıl yapılır?
Bazı fikirler:
Bir bot eklendiğinde veya çıkarıldığında, o en boy oranına en çok uyan formasyonun yeni genişliğini ve yüksekliğini hesaplamak için yeni toplam bot sayısını ve istenen sabit en boy oranını kullanın. Ardından botları yeni boyutlara uyacak şekilde yeniden karıştırın.
Bir bot çıkarıldığında, arkasındaki botu yerine taşıyın ve formasyonun sonuna ulaşıncaya kadar devam edin. Daha sonra arka sıradaki botları bir şekilde karıştırmakla mümkün olduğunca arka sıraya çıkın.
Tamamen farklı olan bir başka fikir, molekül yapılarının bir arada kalma şeklini taklit etmektir. Her botu en yakın dört botu çekerek ve geri kalanını iterek diğer dört botla çevrelenmek isteyin. Ters kare yasası kullanarak ayrılmayı sağlamak için çok yakın olan tüm botları (dördü de dahil) püskürtün. Ayrıca, tüm yapıyı şekillendirmek için ek bir güce ihtiyacınız olacaktır. Ancak, bu kulağa oldukça pahalı geliyor.
GÜNCELLEME : Yani sarahm'ın cevabına baktığımda, iyi boyutlar veren iyi bir genel fonksiyon buldum.
Önce genişlik ve yükseklik için aşağıdaki eşzamanlı denklemi çözdüm ve sonra cevapları yuvarladım.
width/height=aspect ratio of your choice
width*height=number of bots
Bu size bot sayınız için o en boy oranına en yakın tamsayıyı verir. En yakın dikdörtgen, zamanın yarısı çok büyük ve yarısı da çok küçük olacaktır (elbette bazen doğru olacaktır, ancak kimin umurunda). Dikdörtgenin biraz fazla büyük olduğu durumlarda , hiçbir şey yapılmasına gerek yoktur. Arka sıra hemen hemen dolu olacak, bu da ideal. Dikdörtgenin biraz fazla küçük olduğu durumlarda , sorunlarınız var, çünkü ufacık küçük taşma kendi rütbesine gitmek zorunda kalacak, üzerinde sadece birkaç bot bulunan bir rütbe yarattı, ki bu hoş görünmüyor. Farkın büyük olduğu durumlar da var(genişliğin yarısından daha büyük), bu durumda farkı küçük yapmak için bir sıralama ekleyin veya çıkarın. Ardından, dikdörtgen çok küçük olduğunda, biraz daha büyük yapmak için bir sütun ekleyin. Bunu yaptıktan sonra arka sıra her zaman diğer sıraların en az yarısına sahip olacak gibi görünüyor .
GÜNCELLEME
Boyutları aldıktan sonra, bunları geçerli boyutlarla karşılaştırın. Yeni boyutun cephesi daha büyükse, her rütbe için, aşağıdaki rütbeden botlar açın ve bu rütbedeki bot sayısı cepheye eşit oluncaya kadar mevcut rütbeye itin. Arka sıraya gelene kadar bu algoritmaya devam edin. Bu algoritmayı kullanarak, botlar yeni boyuta verimli bir şekilde uyacak şekilde hareket edecektir. Bundan sonra, yeni eskiyi arka sıraya itiyorum. Algoritma, yeni cephenin daha küçük olduğu durumlar için biraz farklıdır, ancak anlayabilirsiniz!
Bundan sonra iki sorun daha var. Silme ve yeni botların mutlaka arka sıraya atanmadığı, ancak eklendikleri anda kendilerine en yakın konumun atandığı daha esnek bir ekleme yöntemi.