Я создал для них алгоритм, на самом деле это вариант NP-Hard < href="http://en.wikipedia.org/wiki/Bin_packing_problem" rel="nofollow noreferrer">упаковка контейнера, но с бесконечным размером контейнера.
Вы можете попытаться найти несколько статей об этом и попытаться оптимизировать свой алгоритм, но, в конце концов, это останется методом грубой силы, чтобы попробовать все возможности и попытаться минимизировать полученный размер корзины.
Если вам нужно не лучшее решение, а только одно решение, вы можете избежать перебора всех комбинаций. Я создал программу, которая однажды тоже это сделала.
Описание:
Images: array of the input images
ResultMap: 2d array of Booleans
FinalImage: large image
- Отсортируйте массив изображений так, чтобы самое большое изображение было вверху.
- Вычислите общий размер ваших изображений и инициализируйте ResultMap так, чтобы его размер в 1,5 раза превышал общий размер ваших изображений (вы можете сделать этот шаг умнее для лучшего использования памяти и производительности). Сделайте ResultMap того же размера и заполните его значениями False.
- Затем добавьте первое изображение слева от вашего FinalImage и установите все логические значения в ResultMap в значение true от 0,0 до ImageHeight, ImageWidth.
ResultMap используется для быстрой проверки того, можете ли вы разместить изображение на текущем FinalImage. Вы можете оптимизировать его для использования int32 и использовать каждый бит для одного пикселя. Это уменьшит память и повысит производительность, потому что вы можете проверять 32 бита сразу (используя маску). Но это станет более сложным, потому что вам придется подумать о маске, которую вам нужно будет сделать для краев вашего изображения.
Теперь я опишу реальный цикл «алгоритма».
- For each image in the array try to find a place were it would fit. You could write a loop which would look trough the ResultMap array and look for a false value and than start to see if it remains false in both directions for the size of the image to place.
- If you find a place, copy the image to the FinalImage and update the correct booleans in ResultMap
- Если вы можете найти место, увеличьте размер FinalImage достаточно (поэтому посмотрите на края, где требуется минимальное количество дополнительного пространства), а также синхронизируйте его с ResultMap.
- ПЕРЕЙТИ 1 :)
Это не оптимально, но может решить проблему достаточно оптимальным способом (особенно если в конце есть несколько изображений меньшего размера, чтобы заполнить пробелы).
person
Davy Landman
schedule
24.09.2008