Примечание. Я не совсем понял ответ Фредерика, поэтому сам решил проблему и придумал то, что кажется тем же решением. Я подумал, что мог бы также объяснить, что я сделал, если это будет полезно.
Сначала я нормализовал соотношение сторон вида и вида предметов. (Я предполагаю, что вы не хотите вращать предметы.)
a = (view_width/view_height) / (item_width/item_height)
Теперь упаковка прямоугольника с соотношением ширины и высоты a
с квадратами эквивалентна упаковке вида с элементами. В идеальном случае наша сетка (теперь квадратов) должна полностью заполнить прямоугольник, что даст нам
a = c/r
где r
и c
- номера строк и столбцов:
N = r*c
Умножение / деление этих двух уравнений дает нам
N*a = c^2 N/a = r^2
c = sqrt(N*a) r = sqrt(N/a)
Если сетка идеальна, r
и c
будут целыми числами, но если нет, вы должны попробовать три варианта, упомянутых Фредериком, и оставить тот, где r*c
наименьший, но все же больше N
:
floor(r), ceil(c)
ceil(r), floor(c)
ceil(r), ceil(c)