代码之家  ›  专栏  ›  技术社区  ›  Marko Dumic

把一个矩形分割成给定区域的近似正方形

  •  7
  • Marko Dumic  · 技术社区  · 14 年前

    N Y 我需要分成 较小的矩形,以便:

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

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

    谢谢。

    2 回复  |  直到 14 年前
        1
  •  9
  •   Thomas    14 年前

    你所描述的听起来像是 treemap

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

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

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

    如何将矩形递归地细分为矩形,使其纵横比(例如,max(height/width,width/height))尽可能接近1?所有可能的细分数目都非常大。这个问题属于NP难问题。然而,对于我们的应用,我们不需要最优解,一个好的解 需要在短时间内进行计算。

        2
  •  1
  •   Chr    14 年前

    我一直在做类似的事情。我优先考虑的是简单性,而不是获得尽可能相似的纵横比。这(理论上)应该行得通。在纸上测试了N在1到10之间的一些值。

    N=要创建的矩形总数, Q=最大值(宽度、高度)/最小值(宽度、高度), R=N/Q

    如果Q>N/2,将矩形沿其最长边分成N部分。 如果Q<=N/2,沿最短边将矩形拆分为R(圆角int)部分。 然后沿最短边将子矩形分成N/R(向下取整int)部分。 从下一个子矩形除法的结果中减去向下舍入的值。对所有子矩形重复此操作,或直到创建所需数量的矩形。