矩形马赛克

时间:2011-08-29 12:56:52

标签: geometry

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

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

我理解确定是否与其他矩形交叉是多么容易。它足以查看是否包含任何其他矩形中顶点的坐标。

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

在我的情况下,小窗口出现在大窗口中。问题看起来像。 enter image description here

2 个答案:

答案 0 :(得分:1)

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

不同的是,你正在处理UI,而不是纹理或其他一些问题。您可以使用上述解决方案,但我想您需要某种过渡动画,以便用户看到/了解他/她的所有窗口最终会在哪里。

这取决于我认为这个功能的工作原理。用户是否允许首先与窗口交叉?

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

我一直在桌子上玩不同大小的纸张矩形,这是我想到的:

第一确定您是否有足够的空间:将左侧空间拆分为矩形并添加矩形区域,然后检查空间区域是否大于或等于交叉区域。如果是这样继续。

  1. 遍历所有矩形并找到交叉点。
  2. 对于每个交叉点,存储所涉及的矩形。
  3. 遍历所有具有交叉点的矩形并将可用空间存储在
    中 其余方向(例如左,左上,上等)
  4. 对于每个带有交叉点的矩形,在空格上添加水平左边以检查它是否大于交叉矩形的宽度,然后对空格中的垂直左边做同样的操作。此步骤应允许确定是否只能移动带有交叉点的矩形以获得足够的空间来清除交叉点。
  5. 如果以上aplies使用剩余空间来确定移动每个矩形需要多少。根据剩余间距较大(例如,总顶部+底部与总左侧+右侧)选择分离方向(垂直或水平)。然后在分离方向上移动每个方框(例如,如果水平移动具有该量的最小水平空间的矩形,则将另一个矩形移向其剩余空间)并重新评估该情况的交叉点。如果没有十字路口,那么很好......否则,请对垂直空间做同样的事情。
  6. 如果此品脱4不适用,则意味着您无法使用周围的空间轻微移动矩形,则需要使用更多空间。包括最近的方框及其空间 然后再次检查额外空间是否足够。
  7. 这就是我的意思,将剩余空间拆分成方框以查找区域: boxes and intersections

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

    HTH

答案 1 :(得分:0)

一个简单的解决方案是蛮力。取出小矩形的所有排列,并在最左上方的位置一次放置一个。如果你设法放置它们,你就有了解决方案。如果失败,则回溯到下一个排列并再试一次。如果你的选项用完了,那你就失败了。这将起作用,但显然当矩形数量增加时它将很快无法使用。