Geometry 矩形马赛克

Geometry 矩形马赛克,geometry,Geometry,我有一个大窗户,里面有n个小窗户。任务是放置小窗户,使它们之间没有交叉点,或者说这是不可能做到的 所有窗口都是矩形的,并且具有所有顶点的坐标 我知道判断一个矩形是否和其他矩形相交是多么容易。只要看看是否包含任何其他矩形中顶点的坐标就足够了 但这里是如何找到一个可以移动这个矩形的自由区域 在我的例子中,小窗口出现在大窗口中。问题看起来是这样的。 一个微不足道的解决方案就是暴力。取所有小矩形的排列,一次一个放置在最左上方的位置。如果你成功地放置了它们,你就有了一个解决方案。如果失败,则返回到下一个排

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

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

我知道判断一个矩形是否和其他矩形相交是多么容易。只要看看是否包含任何其他矩形中顶点的坐标就足够了

但这里是如何找到一个可以移动这个矩形的自由区域

在我的例子中,小窗口出现在大窗口中。问题看起来是这样的。
一个微不足道的解决方案就是暴力。取所有小矩形的排列,一次一个放置在最左上方的位置。如果你成功地放置了它们,你就有了一个解决方案。如果失败,则返回到下一个排列并重试。如果你没有选择,那么你就失败了。这将起作用,但显然,当矩形的数量增加时,它将很快无法使用

一个微不足道的解决方案就是暴力。取所有小矩形的排列,一次一个放置在最左上方的位置。如果你成功地放置了它们,你就有了一个解决方案。如果失败,则返回到下一个排列并重试。如果你没有选择,那么你就失败了。这将起作用,但显然,当矩形的数量增加时,它将很快无法使用

这看起来有点像个问题。 有很多人可以帮忙

不同之处在于,您处理的是UI,而不是纹理或其他问题。您可以使用上面提到的解决方案,但我认为您需要某种过渡动画,以便用户看到/了解他/她的所有窗口的最终位置

我想这取决于这个功能是如何工作的。是否允许用户首先与窗口相交

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

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

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

  • 在所有矩形中循环并找到交点
  • 对于每个交叉点,存储所涉及的矩形
  • 循环遍历所有具有交点的矩形,并将可用空间存储在
    其余方向(如左、左上、左上等)
  • 对于每个具有交叉点的矩形,添加水平剩余空间以检查其是否大于交叉点矩形的宽度,然后对垂直剩余空间执行相同操作。此步骤应允许确定是否只能移动具有交点的矩形,以获得足够的空间清除交点
  • 如果上述应用程序使用剩余空间来确定移动每个矩形所需的量。选择分离方向(垂直或水平),其基础是剩余间距更大(例如,总顶部+底部vs总左侧+右侧)。然后沿分离方向移动每个框(例如,如果水平移动具有最小水平空间的矩形,则将另一个矩形移向其剩余空间),并重新计算这种情况下的交点。如果没有交叉点,万岁……否则,垂直空间也一样
  • 如果这个品脱4不适用,这意味着您不能使用矩形周围的空间稍微移动矩形,您需要使用更多的空间。包括最近的盒子及其空间 然后再次检查额外空间是否足够 以下是我将剩余空间拆分为方框以查找区域的意思:

    我建议首先检查我链接到的矩形包装解决方案,因为它们以最佳方式使用可用空间,而且它实际上是有效的,而不是我玩纸时得到的:) 我还没有编写/测试我的解决方案


    这看起来有点像个问题。 有很多人可以帮忙

    不同之处在于,您处理的是UI,而不是纹理或其他问题。您可以使用上面提到的解决方案,但我认为您需要某种过渡动画,以便用户看到/了解他/她的所有窗口的最终位置

    我想这取决于这个功能是如何工作的。是否允许用户首先与窗口相交

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

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

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

  • 在所有矩形中循环并找到交点
  • 对于每个交叉点,存储所涉及的矩形
  • 循环遍历所有具有交点的矩形,并将可用空间存储在
    其余方向(如左、左上、左上等)
  • 对于每个具有交叉点的矩形,添加水平剩余空间以检查其是否大于交叉点矩形的宽度,然后对垂直剩余空间执行相同操作。此步骤应允许确定是否只能移动具有交点的矩形,以获得足够的空间清除交点
  • 如果上述应用程序使用剩余空间来确定移动每个矩形所需的量。选择分离方向(垂直或水平),其基础是剩余间距更大(例如,总顶部+底部vs总左侧+右侧)。然后沿分离方向移动每个箱子(例如,如果水平移动re