检查两个框是否重叠的算法

时间:2014-01-04 19:40:24

标签: algorithm

我已经理解了矩形情况下的算法,但我对带有x,y,z和高度作为值的方框感到困惑。不重叠的条件是 1)方框A上方的方框A. 2)框B下面的方框A. 3)方框B左边的方框B. 4)方框B右边的方框

我说错了吗?请引导一些遗漏点。

2 个答案:

答案 0 :(得分:21)

当且仅当所有轴的投影重叠时,两个轴对齐的框(任何尺寸)重叠。轴的投影就是该轴的坐标范围。

enter image description here

上图中的蓝色和绿色框重叠,因为它们对两个轴的投影重叠。蓝色和橙色框不重叠,因为它们对x轴的投影不重叠(注意它们对y轴的投影重叠)。绿色和橙色框不重叠,因为它们对y轴的投影不重叠(而它们与x轴的投影重叠)。

因此,当谈到1D盒子(间隔)的代码时,我们有:

box1 = (xmin1, xmax1)
box2 = (xmin2, xmax2)
overlapping1D(box1,box2) = xmax1 >= xmin2 and xmax2 >= xmin1

对于2D盒子(矩形),我们有:

box1 = (x:(xmin1,xmax1),y:(ymin1,ymax1))
box2 = (x:(xmin2,xmax2),y:(ymin2,ymax2))
overlapping2D(box1,box2) = overlapping1D(box1.x, box2.x) and 
                           overlapping1D(box1.y, box2.y)

对于3D盒子,我们有:

box1 = (x:(xmin1,xmax1),y:(ymin1,ymax1),z:(zmin1,zmax1))
box2 = (x:(xmin2,xmax2),y:(ymin2,ymax2),z:(zmin2,zmax2))
overlapping3D(box1,box2) = overlapping1D(box1.x, box2.x) and 
                           overlapping1D(box1.y, box2.y) and
                           overlapping1D(box1.z, box2.z)

答案 1 :(得分:2)

if(xMin1 <= xMax2 || xMax1 >= xMin1)

if(yMin1 <= yMax2 || yMax1 >= yMin1)

if(zMin1 <= zMax2 || zMax1 >= zMin1)

所有这些条件必须适用于不重叠的方框。

我还假设盒子边缘可以放在相同的x,y,z坐标上。

如果没有,只需取出相同的标志。

if(xMin1 < xMax2 || xMax1 > xMin2)

if(yMin1 < yMax2 || yMax1 > yMin2)

if(zMin1 < zMax2 || zMax1 > zMin2)