【问题标题】:Mosaic of rectangles矩形马赛克
【发布时间】:2011-08-30 05:46:35
【问题描述】:

我有一个大窗口,里面有 n 个小窗口。放置小窗户的任务,使它们之间没有交集,或者说这是不可能的。

所有的窗口都是矩形的,并且有所有顶点的坐标。

我知道确定一个矩形是否与其他矩形交叉是多么容易。看看是否包含其他矩形的顶点坐标就足够了。

但是这里是如何找到一个可以移动这个矩形的空闲区域?

就我而言,小窗口出现在大窗口中。问题看起来像。

【问题讨论】:

    标签: geometry


    【解决方案1】:

    这看起来有点像Rectangle Packing 问题。 examplesimplementations 可以提供帮助。

    不同之处在于您处理的是 UI,而不是纹理或其他问题。您可以采用上述解决方案,但我想您将需要某种过渡动画,以便用户看到/理解他/她的所有窗口将在哪里结束。

    我认为这取决于此功能的工作方式。是否允许用户首先与窗口相交?

    我想所有的矩形都需要适应一个大的(显示器)

    我一直在桌子上玩不同大小的矩形纸,我想到了以下几点:

    第一个确定您是否有足够的空间:将剩余的空间分割成矩形并添加矩形区域,然后检查空间区域是否大于或等于相交区域。如果是这样,请继续。

    1. 遍历所有矩形并找到交叉点。
    2. 对于每个交叉点,存储相关的矩形。
    3. 遍历所有具有交叉点的矩形并将可用空间存储在
      其余方向(例如左、左上、上等)
    4. 对于每个有交叉的矩形,添加水平剩余空间以检查它是否大于交叉矩形的宽度,然后对垂直剩余空间执行相同操作。此步骤应允许确定您是否只能移动具有交叉点的矩形以获得足够的空间来清除交叉点。
    5. 如果上述情况适用,请使用剩余空间来确定您需要移动每个矩形的量。根据剩余间距较大(例如,总顶部+底部与总左+右)选择分离方向(垂直或水平)。然后沿分离方向移动每个框(例如,如果水平移动具有最小水平空间的矩形该量,然后将另一个矩形移向它的剩余空间)并重新评估这种情况下的交点。如果没有交叉点,万岁……否则,对垂直空间做同样的事情。
    6. 如果此品脱 4 不适用,这意味着您无法使用矩形周围的空间稍微移动矩形,您需要使用更多空间。包括最近的盒子和它的空间 然后再次检查额外空间是否足够。

    这就是我将剩余空间分成盒子以找到该区域的意思:

    我建议首先检查我链接到的矩形包装解决方案,因为它们以最佳方式使用可用空间并且它确实有效,而不是我玩纸带来的东西 :) 我还没有编码/测试我的解决方案。

    HTH

    【讨论】:

      【解决方案2】:

      一个简单的解决方案是蛮力。取小矩形的所有排列,一次一个地放置在最左上角的位置。如果你设法放置它们,你就有了解决方案。如果失败,则返回到下一个排列并重试。如果你用完了选项,那么你就失败了。这会起作用,但很明显,当矩形数量增加时,它很快就会变得不可用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-20
        • 1970-01-01
        • 2011-09-29
        • 2020-12-26
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多