我有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×300,和我有三个缩略图,它应该返回100,而是返回33。
也许不是最佳的(如果它的作品,我还没有尝试过),但我觉得比你目前的做法更好:
瓦特:矩形的宽度
H:矩形的高度
N:数量的图像
A = W * H:矩形的面积。
IA =在理想情况下的图像的A / N最大的区域。
IL = SQRT(IA)在理想情况下的图像的最大长度。
NW = ROUND_UP(W / IL):你需要堆叠在彼此的顶部上的图像的数量。
NH = ROUND_UP(H / IL):你需要彼此相邻堆叠的图像的数目。
升=分钟(重量/ NW,W / NH):图像的长度来使用。
你想要的东西更像
N =缩略图x的数=一个矩形Y的一侧=另一侧升=缩略图的一边的长度
升= SQRT((X * Y)/ n)的
这是基于我的最终代码断未知的(谷歌)公司的答复:谁想要知道我的第一篇文章是在什么语言的家伙,这是VisualDataflex:
Function ResizeThumbnails Integer iItems Integer iWidth Integer iHeight Returns Integer
Integer iArea iIdealArea iIdealSize iRows iCols iSize
// If there are no items we don't care how big the thumbnails are!
If (iItems = 0) Procedure_Return
// Area of the container.
Move (iWidth * iHeight) to iArea
// Max area of an image in the ideal case (1 image).
Move (iArea / iItems) to iIdealArea
// Max size of an image in the ideal case.
Move (sqrt(iIdealArea)) to iIdealSize
// Number of rows.
Move (round((iHeight / iIdealSize) + 0.50)) to iRows
// Number of cols.
Move (round((iWidth / iIdealSize) + 0.50)) to iCols
// Optimal size of an image.
Move ((iWidth / iCols) min (iHeight / iRows)) to iSize
// Check to make sure it is at least the minimum.
Move (iSize max iMinSize) to iSize
// Return the size
Function_Return iSize
End_Function
这应该工作。 它解决了一个算法,而不是一个方程式。 该算法如下:
- SPAN矩形的整个短边与所有的平方
- 降低方块数在该跨度(作为结果,增加了尺寸),直到正方形的深度超过该矩形的长边
- 停车时,跨度达1,因为这是一样好,我们可以得到。
下面是代码,用JavaScript编写的:
function thumbnailSize(items, width, height, min) {
var minSide = Math.min(width, height),
maxSide = Math.max(width, height);
// lets start by spanning the short side of the rectange
// size: the size of the squares
// span: the number of squares spanning the short side of the rectangle
// stack: the number of rows of squares filling the rectangle
// depth: the total depth of stack of squares
var size = 0;
for (var span = items, span > 0, span--) {
var newSize = minSide / span;
var stack = Math.ceil(items / span);
var depth = stack * newSize;
if (depth < maxSide)
size = newSize;
else
break;
}
return Math.max(size, min);
}
目标C ...的正方形侧的用于在含有矩形物品的给定的计数长度。
int count = 8; // number of items in containing rectangle
int width = 90; // width of containing rectangle
int height = 50; // width of container
float sideLength = 0; //side length to use.
float containerArea = width * height;
float maxArea = containerArea/count;
float maxSideLength = sqrtf(maxArea);
float rows = ceilf(height/maxSideLength); //round up
float columns = ceilf(width/maxSideLength); //round up
float minSideLength = MIN((width/columns), (height/rows));
float maxSideLength = MAX((width/columns), (height/rows));
// Use max side length unless this causes overlap
if (((rows * maxSideLength) > height) && (((rows-1) * columns) < count) ||
(((columns * maxSideLength) > width) && (((columns-1) * rows) < count))) {
sideLength = minSideLength;
}
else {
sideLength = maxSideLength;
}
我的JavaScript实现:
var a = Math.floor(Math.sqrt(w * h / n));
return Math.floor(Math.min(w / Math.ceil(w / a), h / Math.ceil(h / a)));
当w
是矩形的宽度, h
是高度, n
是要在挤平方数。
在该解决方案https://math.stackexchange.com/a/466248完美的作品。
未经优化的JavaScript实现:
var getMaxSizeOfSquaresInRect = function(n,w,h)
{
var sw, sh;
var pw = Math.ceil(Math.sqrt(n*w/h));
if (Math.floor(pw*h/w)*pw < n) sw = h/Math.ceil(pw*h/w);
else sw = w/pw;
var ph = Math.ceil(Math.sqrt(n*h/w));
if (Math.floor(ph*w/h)*ph < n) sh = w/Math.ceil(w*ph/h);
else sh = h/ph;
return Math.max(sw,sh);
}
文章来源: Resizing N # of squares to be as big as possible while still fitting into box of X by Y dimensions. (Thumbnails!)