Algorithm 检测两个矩形是否可以组合成一个矩形

Algorithm 检测两个矩形是否可以组合成一个矩形,algorithm,math,geometry,Algorithm,Math,Geometry,我正在寻找一种算法,它采用由(xa1,ya1,xa2,ya2)和(xb1,yb1,xb2,yb2)定义的两个矩形,检查它们是否可以组合成单个矩形,如果可以,则返回新的矩形。例如: xa1=0,ya1=0,xa2=320,ya2=119 xb1=0,yb1=120,xb2=320,yb2=239 这两个矩形可以组合成以下矩形: xc1=0,yc1=0,xc2=320,yc2=240 您将如何实现这种算法?谢谢 当且仅当一个矩形的一对对对边与另一个矩形的一对对对边重叠时,它们才可以组合。我所说的

我正在寻找一种算法,它采用由(xa1,ya1,xa2,ya2)和(xb1,yb1,xb2,yb2)定义的两个矩形,检查它们是否可以组合成单个矩形,如果可以,则返回新的矩形。例如:

xa1=0,ya1=0,xa2=320,ya2=119
xb1=0,yb1=120,xb2=320,yb2=239
这两个矩形可以组合成以下矩形:

xc1=0,yc1=0,xc2=320,yc2=240

您将如何实现这种算法?谢谢

当且仅当一个矩形的一对对对边与另一个矩形的一对对对边重叠时,它们才可以组合。我所说的重叠,是指它们是平行的,并且至少包含一个公共点

您应该能够理解代码;)


编辑:哦,我忘了提到两个矩形完全重叠的情况。这也不难检查。

我会画出以下图片,并将其作为算法写下来:

...xxxxxxx       xxxxxxx....
.  x  .  x       x   . x   .
.  x  .  x       x   . x   .
...xxxxxxx       xxxxxxx....

xxxxxxx          .......
x     x          .     .
x.....x          xxxxxxx
xxxxxxx          x.....x
.     .          x     x
.......          xxxxxxx

..........
.        .
. xxxx   .
. x  x   .
. x  x   .
. xxxx   .
..........

xxxxxxxxxxxxxx
x            x
x   .......  x
x   .     .  x
x   .     .  x
x   .......  x
x            x
xxxxxxxxxxxxxx

看看角落里的箱子

两个矩形必须相交。边框的角点必须全部落在现有角点上

return r1.Intersects(r2) and r1.BoundingRectangleWith(r2).Corners.IsSubsetOf(r1.Corners.Union(r2.Corners))
这两个条件是必要和充分的。显然,矩形必须相交,而且,由于不能仅使用两个相交矩形创建非角点空白区域,因此边界角点必须位于现有角点上

return r1.Intersects(r2) and r1.BoundingRectangleWith(r2).Corners.IsSubsetOf(r1.Corners.Union(r2.Corners))
实现
相交
边界矩形与
,以及
问题
非常简单。然后可以将它们内联以获得更好的性能,但这将是一堆无法读取的比较

编辑

您的一条评论建议您不希望矩形重叠,只希望接触。在这种情况下,您只需检查一个轴(即X或Y)上矩形的范围是否相等,另一个轴上的范围是否接触。如果两个范围的边界中值有两次出现,则两个范围相接触。请注意,如果您想让right=1触碰left=2,则需要在天花板边界上添加1。

经过多次修改后,我大致算出了您想要的内容。请注意,对于“严格边界框”的含义仍然存在一些争议:原始问题中的示例不符合您给出的描述:

但是,只有当边界框正好是两个合并矩形的大小时,才应该合并矩形,即边界矩形的面积必须与两个源矩形的面积大小完全相同。如果矩形1的面积是a1,矩形2的面积是a2,边界矩形的面积是a3,那么a1+a2=a3

这个实现应该会给你很多想法,我相信你知道如何编写

r.area() == a.area() + b.area()
如果你真的想要的话


:
只要画几幅画,你很快就会明白的。你是什么意思?重叠区域?你的意思是:找到一个矩形,它精确地定义了另外两个矩形的并集,如果它存在的话?刚才注意到我一定理解错了你的问题。
yc2=
240从哪里来?显然你是指两个矩形的边界框,如果它们重叠或接触?(假设240应该是239)有趣的是,boostlibraries1.47.1今天发布了;它包括一个全新的图书馆。。。它已经和。。。我不太擅长写算法。我可以想出一些对我的具体情况有效的方法,但我确信它不会对所有可能的情况都有效:/这就是为什么我更乐意为这个问题找到一些通用的解决方案:)不要忘记矩形不相交的重要情况。我没有将其评为-1。尽管如此,我还是不能想出一些通用的算法。正如我上面所说的,我可以想出一个算法,它可以很好地适用于我的具体情况,但不是所有情况。。。这对我的大脑来说太不可思议了。。。这就是为什么我希望从这里的数学天才那里得到一些帮助:)非常感谢,这正是我想要的(非严格版本)。很抱歉描述得这么糟糕,再次感谢您的帮助!
sample from original question
a: (0,0)-(320,119)   b: (0,120)-(320,239)
r: (0,0)-(320,239)
sample from the comment
a: (0,0)-(1,320)     b: (0,0)-(2,320)
r: (0,0)-(2,320)