需要一种算法来计算矩形的大小

时间:2012-02-14 17:45:45

标签: algorithm graphics graph geometry 2d

我得到一个逻辑谜语,我需要一个有效的算法来解决它。

我有一个大小为w * h(宽*高)的大矩形(方框)。

我还有x个其他尺寸不大但比例固定的矩形。

获取x的最快方法是让每个X矩形的最大尺寸都在框内(大矩形)?

示例:

框矩形尺寸为150 * 50(宽*高),我有25个小矩形。

小矩形的固定比例为3(如果高度= 5则宽度= 5 * 3 = 15)。 让我们调用矩形x的高度。

我想找到最大的X,它允许我将所有矩形插入大矩形(插入框中)。

(小矩形将按行和列放置,例如按比例和最大高度排列5列和5行)

有谁知道一个有效的算法来解决这个问题?

2 个答案:

答案 0 :(得分:0)

嗯什么?

不仅仅是(w * h)/ 75?

是的,不需要括号......但不是你想要的吗?或者我在这里错过了一些东西?

其中w和h是大矩形或父矩形的尺寸。 75是3 * 25。

答案 1 :(得分:0)

我会尝试凭经验解决这个问题(使用backtracking解决)而不是解析,即找到所有可能性*(我将解释*)。基本上我们希望将每个矩形开始,直到矩形可以达到其最大尺寸(最大尺寸可以由最大的矩形定义,可以在碰到其邻居的起点或增长到容器主矩形之前)。这意味着如果我们尝试将每个矩形放在其可能的大小中,那么这些解决方案中的一个将是最佳解决方案。还要注意,这实际上是一个一维问题,因为rects的高度和宽度受比率约束;设置一个隐式设置另一个。

* - 当我说出所有可能性时,我的确意味着最合理的可能性。由于我们处于浮点空间,我们无法测试所有可能性。我们可以测试更精细和更精确,但无法测试所有尺寸。因此,我们定义一个步长来迭代我们将尝试的rects的大小。

const float STEP_SIZE = 0.0001;
float fLastTotalSize = 0;

int main()
{
  PlaceRect(myRects.begin(), myRects.end());
}

void PlaceRect(Iterator currentRect, Iterator end)
{
  if (currentRect == end)
  {
    return;
  }

  float fRectMaxSize = CalculateMaxPossibleRectSize(*currentRect);

  // find the number of steps it will take to iterate from the smallest 
  // rect size to the largest
  int nSteps = fRectMaxSize / STEP_SIZE;

  for(int i = 0; i < nSteps; ++i)
  {
    // based on the step index scale the rect size
    float fCurrentRectTestSize = i*STEP_SIZE;

    currentRect->SetSize(fCurrentRectTestSize);

    float fTotalSize = CalculateTotalSizesOfAllRects();
    if (fTotalSize > fLastTotalSize)
    {
      fLastTotalSize = fTotalSize;
      SaveRectConfiguration();
    }

    // Continue placing the rest of the rects assuming the size 
    // we just set for the current rect 
    PlaceRect(currentRect + 1, end);

    // Once we return we can now reset the current rect size to 
    // something else and continue testing possibilities 
  }
}

根据步长和矩形数量,这可能会持续很长时间,但会找到经验解决方案。