我有一组 N 正数,以及一个尺寸 X 和 Y 的矩形,我需要将其划分为 N 较小的矩形,以便:
我需要这方面的指示。你知道网上描述的这种算法吗?你有什么想法(伪代码很好)吗?
感谢。
答案 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数。