Mam boty w prostokątnej formacji z rzędami i kolumnami. Problem pojawia się, gdy bot jest dodawany lub usuwany z formacji. Kiedy tak się dzieje, boty muszą się tak przestawić, aby formacja prostokątna była w przybliżeniu tym samym współczynnikiem kształtu i była możliwie jak najbardziej prostokątna. Jak to zrobić?
Jakieś pomysły:
Po dodaniu lub usunięciu bota użyj nowej całkowitej liczby botów i pożądanego stałego współczynnika kształtu, aby obliczyć nową szerokość i wysokość formacji, która najbardziej pasuje do tego współczynnika kształtu. Następnie w jakiś sposób przetasuj boty, aby dopasować je do nowych wymiarów.
Po usunięciu bota przenieś bota, który był za nim, na swoje miejsce i kontynuuj, aż dojdziesz do końca formacji. Następnie wyrównaj tylną rangę tak bardzo, jak to możliwe, w jakiś sposób tasując boty z tylnej rangi.
Innym pomysłem, który jest zupełnie inny, jest naśladowanie sposobu, w jaki struktury molekularne pozostają razem. Spraw, aby każdy bot chciał być otoczony czterema innymi botami, przyciągając cztery najbliższe boty i odpychając resztę. Odeprzyj wszystkie boty (w tym cztery), które są zbyt blisko, aby zapewnić separację, stosując odwrotne prawo kwadratowe. Potrzebujesz także dodatkowej siły, aby ukształtować całą konstrukcję. Ale to brzmi bardzo kosztownie obliczeniowo.
AKTUALIZACJA : Więc patrząc na odpowiedź Sarahm, wymyśliłem dobrą ogólną funkcję, która daje dobre wymiary.
Najpierw rozwiązałem poniższe równanie szerokości i wysokości, a następnie zaokrągliłem odpowiedzi.
width/height=aspect ratio of your choice
width*height=number of bots
To daje ci najbliższy prostokąt całkowity do tego współczynnika kształtu dla twojej liczby botów. Najbliższy prostokąt będzie w połowie przypadków zbyt duży, a w połowie będzie zbyt mały (oczywiście czasami będzie to w sam raz, ale kogo to obchodzi). W przypadkach, gdy prostokąt jest trochę za duży, nie trzeba nic robić. Tylna pozycja skończy się prawie pełna, co jest idealne. W przypadkach, gdy prostokąt jest trochę za mały, masz problemy, ponieważ ten malutki przepełnienie będzie musiał przejść do własnej rangi, utworzył rangę z tylko kilkoma botami, co nie wygląda ładnie. Istnieją również przypadki, w których różnica jest duża(większa niż połowa szerokości), w takim przypadku dodaj lub odejmij jedną pozycję, aby różnica była niewielka. Następnie, gdy prostokąt jest zbyt mały, dodaj jedną kolumnę, aby była nieco większa. Po zrobieniu tego wygląda na to, że tylna ranga zawsze będzie miała co najmniej o połowę mniej botów niż pozostałe szeregi.
AKTUALIZACJA
Po uzyskaniu wymiarów porównaj je z bieżącymi wymiarami. Jeśli pierzeja nowego wymiaru jest większa, dla każdej rangy strzelaj botami z poniższej rangi i pchaj je na bieżącą rangę, aż liczba botów na tej randze będzie równa pierzei. Kontynuuj ten algorytm, aż dojdziesz do tylnej rangi. Korzystając z tego algorytmu, boty będą się skutecznie dopasowywać do nowego wymiaru. Potem po prostu przesuwam nowy stary na tylną pozycję. Algorytm jest nieco inny dla przypadków, w których nowy fronton jest mniejszy, ale możesz to rozgryźć!
Następne dwa problemy. Usuwanie i bardziej elastyczna metoda dodawania, w której nowe boty niekoniecznie są przypisywane do tylnej rangi, ale w zależności od tego, która pozycja jest im najbliższa w momencie ich dodawania.