У меня есть N квадратов. У меня прямоугольная коробка. Я хочу, чтобы все квадраты поместились в коробке. Я хочу, чтобы квадраты были как можно больше.
Как вычислить наибольший размер квадратов, чтобы все они поместились в коробке?
Это для миниатюр в галерее миниатюр.
int function thumbnailSize(
iItems, // The number of items to fit.
iWidth, // The width of the container.
iHeight, // The height of the container.
iMin // The smallest an item can be.
)
{
// if there are no items we don't care how big they are!
if (iItems = 0) return 0;
// Max size is whichever dimension is smaller, height or width.
iDimension = (iWidth min iHeight);
// Add .49 so that we always round up, even if the square root
// is something like 1.2. If the square root is whole (1, 4, etc..)
// then it won't round up.
iSquare = (round(sqrt(iItems) + 0.49));
// If we arrange our items in a square pattern we have the same
// number of rows and columns, so we can just divide by the number
// iSquare, because iSquare = iRows = iColumns.
iSize = (iDimension / iSquare);
// Don't use a size smaller than the minimum.
iSize = (iSize max iMin);
return iSize;
}
Этот код в настоящее время работает нормально. Идея заключается в том, чтобы взять наименьший размер прямоугольного контейнера, представить, что контейнер является квадратом этого размера, а затем предположить, что у нас есть равное количество строк и столбцов, достаточное для размещения внутри квадратов iItems.
Эта функция отлично работает, если контейнер в основном квадратный. Однако, если у вас есть длинный прямоугольник, миниатюры получаются меньше, чем могли бы быть. Например, если мой прямоугольник имеет размер 100 x 300 и у меня есть три эскиза, он должен вернуть 100, но вместо этого возвращает 33.