stworzyłem algorytm dla tego te, to faktycznie wariant problemu NP-HardBin packing, ale z nieskończonej wielkości bin.
Możesz spróbować znaleźć kilka artykułów na ten temat i spróbować zoptymalizować algorytm, ale ostatecznie pozostanie to brutalny sposób, aby wypróbować każdą możliwość i spróbować zminimalizować wynikowy rozmiar bin.
Jeśli nie potrzebujesz najlepszego rozwiązania, ale tylko jednego rozwiązania, możesz uniknąć brutalnego forsowania wszystkich kombinacji. Stworzyłem program, który również to zrobił.
Opis:
Images: array of the input images
ResultMap: 2d array of Booleans
FinalImage: large image
- Sortuj tablica obrazy tak, że największy obraz jest na górze.
- Należy obliczyć całkowity rozmiar obrazów i zainicjować mapę wyników, aby jej rozmiar był 1,5 razy większy niż całkowity rozmiar obrazów (można by uczynić ten krok bardziej inteligentnym dla lepszego wykorzystania pamięci i wydajności). Ustaw ResultMap na taki sam rozmiar i wypełnij go wartościami fałszywymi.
- Następnie dodaj pierwszy obraz po lewej stronie FinalImage i ustaw wszystkie wartości logiczne w ResultMap true od 0,0 do ImageHeight, ImageWidth.
Mapa wyników służy do szybkiego sprawdzenia, czy można dopasować obraz do bieżącego obrazu FinalImage. Możesz zoptymalizować go, aby użyć int32 i użyć każdego bitu na jeden piksel. Zmniejszy to pamięć i zwiększy wydajność, ponieważ możesz sprawdzić 32 bitów naraz (używając maski). Ale stanie się to trudniejsze, ponieważ będziesz musiał pomyśleć o masce, którą musisz wykonać dla krawędzi obrazu.
Teraz opiszę prawdziwą pętlę "algorytmu".
- Dla każdego obrazu w tablicy spróbuj znaleźć miejsce, w którym by pasowało. Możesz napisać pętlę, która wyglądałaby przez tablicę ResultMap i szukać fałszywej wartości, a następnie zacząć sprawdzać, czy pozostaje ona fałszywa w obu kierunkach dla rozmiaru obrazu do umieszczenia.
- Jeśli znajdziesz miejsce, skopiuj obraz do FinalImage i aktualizację prawidłowych wartości logicznych w ResultMap
- Jeśli cand znaleźć miejsce, zwiększyć rozmiar FinalImage wystarczy (tak spojrzeć na brzegach, gdzie potrzebna jest minimalna ilość dodatkowego miejsca) i synchronizować również, że z ResultMap
- GOTO 1 :)
to nie jest optymalna, ale może rozwiązać ten problem w możliwie optymalny sposób (zwłaszcza jeśli istnieje jest kilka mniejszych obrazów do na końcu napełnij gabki).
hej Linor! więc co w końcu zrobiłeś? to pomoże ... – Lazer