调整大小的正方形的N#要尽可能地大,同时还装配到X的盒子由Y尺寸。 (缩略图!)(Resizin

2019-08-18 22:28发布

我有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。

Answer 1:

也许不是最佳的(如果它的作品,我还没有尝试过),但我觉得比你目前的做法更好:

瓦特:矩形的宽度

H:矩形的高度

N:数量的图像

A = W * H:矩形的面积。

IA =在理想情况下的图像的A / N最大的区域。

IL = SQRT(IA)在理想情况下的图像的最大长度。

NW = ROUND_UP(W / IL):你需要堆叠在彼此的顶部上的图像的数量。

NH = ROUND_UP(H / IL):你需要彼此相邻堆叠的图像的数目。

升=分钟(重量/ NW,W / NH):图像的长度来使用。



Answer 2:

你想要的东西更像

N =缩略图x的数=一个矩形Y的一侧=另一侧升=缩略图的一边的长度

升= SQRT((X * Y)/ n)的



Answer 3:

这是基于我的最终代码断未知的(谷歌)公司的答复:谁想要知道我的第一篇文章是在什么语言的家伙,这是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


Answer 4:

这应该工作。 它解决了一个算法,而不是一个方程式。 该算法如下:

  • 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);
}


Answer 5:

目标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;
}


Answer 6:

我的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是要在挤平方数。



Answer 7:

在该解决方案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!)