【问题标题】:Need an algorithm to calculate the size of a rectangle需要一种算法来计算矩形的大小
【发布时间】:2012-02-14 17:45:44
【问题描述】:

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

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

我还有 x 个其他没有大小但比例固定的矩形。

获取 x 的最快方法是什么,这将使每个 X 矩形的最大尺寸都在框内(大矩形)?

例子:

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

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

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

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

有人知道解决这个问题的有效算法吗?

【问题讨论】:

  • 我尝试取小矩形的最大尺寸和最小值并计算需要多少行和列,然后将最大尺寸测量为向量。这不是一个很好的解决方案。

标签: algorithm graphics graph geometry 2d


【解决方案1】:

嗯,什么?

不就是 (w*h)/75 吗?

是的,不需要括号...但这不是您想要的吗?还是我在这里遗漏了什么?

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

【讨论】:

  • 在示例中我不知道小矩形的大小。这就是我想要找到的。我只知道高和宽的比例。在实际情况下,我知道大矩形的大小、小矩形的数量以及高宽比。
【解决方案2】:

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

* - 当我说所有可能性时,我指的是最合理的可能性。由于我们在浮点空间中,我们无法测试所有可能性。我们可以测试越来越精细的精度,但无法测试所有尺寸。因此,我们定义了一个步长来迭代我们将尝试的矩形的大小。

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 
  }
}

根据步长和矩形的数量,这可能会运行很长时间,但会为您找到经验解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多