将矩形划分为给定区域的近似正方形

时间:2010-03-28 14:32:29

标签: algorithm rectangles

我有一组 N 正数,以及一个尺寸 X Y 的矩形,我需要将其划分为 N 较小的矩形,以便:

  • 每个较小矩形的表面积与给定集合中的对应数量成比例
  • 大矩形的所有空间都被占用,小矩形之间没有剩余的空间
  • 每个小矩形的形状应尽可能接近方形
  • 执行时间应该相当小

我需要这方面的指示。你知道网上描述的这种算法吗?你有什么想法(伪代码很好)吗?

感谢。

2 个答案:

答案 0 :(得分:9)

您所描述的内容听起来像treemap

  

树图将分层(树形结构)数据显示为一组嵌套矩形。树的每个分支都有一个矩形,然后用表示子分支的较小矩形平铺。叶节点的矩形具有与数据上指定维度成比例的区域。

该维基百科页面链接到a page by Ben Shneiderman,它提供了一个很好的概述和Java实现的链接:

  

然后在教师休息室里对此感到困惑的时候,我得到了啊哈!当你向下穿过水平时,将屏幕分成水平和垂直方向交替的矩形的经验。这种递归算法看起来很有吸引力,但我花了几天时间才能说服自己,它总能工作并编写一个六行算法。

维基百科也向"Squarified Treemaps" by Mark Bruls, Kees Huizing and Jarke J. van Wijk(PDF)提出了一种可能的算法:

  

我们如何将矩形递归地镶嵌成矩形,使得它们的纵横比(例如max(高度/宽度,宽度/高度))尽可能接近1?所有可能的细分都非常多。这个问题属于NP难问题。但是,对于我们的应用,我们不需要最佳解决方案,一个很好的解决方案   可以在短时间内计算出来。

您没有在问题中提及任何递归,因此您的情况可能只是树形图的一个级别;但由于算法一次只能在一个级别上工作,所以这应该没问题。

答案 1 :(得分:1)

我一直在做类似的事情。我优先考虑简单性而不是尽可能地获得相似的宽高比。这应该(理论上)起作用。在纸上测试了N的1到10之间的值。

N =要创建的帐户总数, Q =最大(宽度,高度)/分钟(宽度,高度), R = N / Q

如果Q&gt; N / 2,将矩形沿其最长边分成N个部分。 如果Q <= N / 2,则沿着其最短边将R中的矩形(圆形int)分开。 然后沿着最短边将Nre R(向下舍入的int)部分拆分。 从下一个子面积除法的结果中减去向下舍入的值。对所有子项重复或直到创建所需的rects数。