Algorithm 查找所有可能的矩形放置可能性
以下问题: 假设我们有一个包含几个矩形的矩形贴图。 我想找到所有可能的“最大”矩形,它们可以放置在地图上,而不与任何其他矩形相交。我指的是不能向任何方向放大的矩形 有人知道执行此任务的算法吗Algorithm 查找所有可能的矩形放置可能性,algorithm,Algorithm,以下问题: 假设我们有一个包含几个矩形的矩形贴图。 我想找到所有可能的“最大”矩形,它们可以放置在地图上,而不与任何其他矩形相交。我指的是不能向任何方向放大的矩形 有人知道执行此任务的算法吗 我会建议一个解决方案,它可能不会更快,但应该可以完成这项工作 这样做的目的是将每个矩形逐个放置。每次在地图中添加矩形时,请检查它是否与其他矩形相交。如果是这样的话,根据交叉点的形状,将这两个矩形分割成正确的对应新矩形 很容易看出,如果一个新矩形(绿色)覆盖了整个受影响的矩形(红色),那么只有新矩形会被拆
我会建议一个解决方案,它可能不会更快,但应该可以完成这项工作 这样做的目的是将每个矩形逐个放置。每次在地图中添加矩形时,请检查它是否与其他矩形相交。如果是这样的话,根据交叉点的形状,将这两个矩形分割成正确的对应新矩形 很容易看出,如果一个新矩形(绿色)覆盖了整个受影响的矩形(红色),那么只有新矩形会被拆分。否则,双方都会 只需一个接一个地添加并正确地将它们分开,您将得到完整的矩形集,您只需迭代以找到“最大”矩形,如果它是指面积最大的矩形
这个算法应该是O(n²)左右,其中n是您添加的矩形数。您可以使用简单的区间代数来实现这一点。为了举例说明,我将在您给我们的示例上添加一些数字。我将使用笛卡尔第一象限,原点在左下角。然后,整个字段是(0,0)到(30,20);矩形在(10,0)到(30,8)之间有角;(0,12)至(13,20);(20,15)至(25,17) 要解决此问题,请根据矩形边相对于其矩形的方向对其进行分组;具体来说,它们面向哪个方向(远离矩形的中心)。窗户的边缘向内。这给了我们四套,每个“面向”方向一套。边在一个方向上用公共坐标描述,在另一个方向上用范围描述。我会让它们保持相同的x-y符号。例如,按y坐标排序:
bottom low-rt up-rt
face_up = (0-10, 0), (10-30, 8), (20-25, 17)
顶部矩形的上边缘与窗口顶部重合;它面朝上,。但是没有空间放一个白色的长方形
类似地,向下的边是
up-left up-rt top
face_down = (0-13, 12), (20-25, 15), (13-30, 20)
现在,将每个矩形边与第一个阻止其开放区域的矩形边进行匹配是一件简单的事情。例如,考虑低RT矩形的FACEYUP边缘,(10-30,8),我们以Y坐标的顺序比较FaseOff-Dead边缘,从Y>=8开始。
(0-13,12)是第一条y>8的边。检查x间隔,我们看到[0,13]和[10-30]确实重叠;我们有一个在(10,8)和(12,13)处有角的块,在每个方向上横向扩展。这将生成蓝色矩形
类似地,我们将使用相同的face_down边缘匹配窗口底部的(face_up)左侧。这将导致您的橙色矩形。然后我们将向上rt(最小)矩形的顶部与窗口顶部:绿色矩形匹配
继续在相反方向,我们发现两条正面向下的边与现有矩形匹配。我们还将上rt矩形的底部与下rt矩形的顶部匹配,从而生成黄色矩形
对face_左边缘和face_右边缘重复此过程,以获得红色和紫色矩形,以及橙色矩形的第二次点击
这是否足以让你实施一个大纲
按顺序对边进行排序使我们能够从每条边进行线性搜索。如果我正确地铸造这段代码,结果是O(N)算法用于N矩形,尽管原始的边排序是O(logn)如何表示所有这些矩形?角点坐标?基本上你想要最大的白色矩形的面积(可能由一个或多个矩形的交点形成)?