我已经理解了关于矩形的算法,但是对于给定x、y、z和高度值的箱子感到困惑。不重叠的条件为:
- 箱子A在箱子B上方
- 箱子A在箱子B下方
- 箱子A在箱子B左侧
- 箱子A在箱子B右侧
我的理解正确吗?请指导一些遗漏的点。
我已经理解了关于矩形的算法,但是对于给定x、y、z和高度值的箱子感到困惑。不重叠的条件为:
我的理解正确吗?请指导一些遗漏的点。
当且仅当所有轴的投影重叠时,两个沿轴对齐的盒子(任意尺寸)重叠。沿某个轴的投影就是该轴上的坐标范围。
上图中的蓝色盒子和绿色盒子重叠,因为它们在所有轴上的投影都重叠。蓝色盒子和橙色盒子不重叠,因为它们在x轴上的投影不重叠(注意它们在y轴上的投影是重叠的)。绿色盒子和橙色盒子不重叠,因为它们在y轴上的投影不重叠(而它们在x轴上的投影是重叠的)。
因此,当涉及到1D盒子(区间)的代码时,我们有:
box1 = (xmin1, xmax1)
box2 = (xmin2, xmax2)
isOverlapping1D(box1,box2) = xmax1 >= xmin2 and xmax2 >= xmin1
对于2D盒子(矩形),我们有:
box1 = (x:(xmin1,xmax1),y:(ymin1,ymax1))
box2 = (x:(xmin2,xmax2),y:(ymin2,ymax2))
isOverlapping2D(box1,box2) = isOverlapping1D(box1.x, box2.x) and
isOverlapping1D(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))
isOverlapping3D(box1,box2) = isOverlapping1D(box1.x, box2.x) and
isOverlapping1D(box1.y, box2.y) and
isOverlapping1D(box1.z, box2.z)
isOverlapping = (x1min < x2max AND x2min < x1max AND y1min < y2max AND y2min < y1max)
(如果需要,可以添加z,如果您想将“接触”称为重叠,请切换到<=
) - brittohalloranisOverlapping = (x1min < x2max && x2min < x1max && y1min < y2max && y2min < y1max)
的翻译是:如果x1
的最小值小于x2
的最大值,且x2
的最小值小于x1
的最大值,同时y1
的最小值小于y2
的最大值,且y2
的最小值小于y1
的最大值,则 isOverlapping
为真。 - itzjackyscodeif(xMin1 <= xMax2 || xMax1 >= xMin2)
if(yMin1 <= yMax2 || yMax1 >= yMin2)
if(zMin1 <= zMax2 || zMax1 >= zMin2)
if(xMin1 < xMax2 || xMax1 > xMin2)
if(yMin1 < yMax2 || yMax1 > yMin2)
if(zMin1 < zMax2 || zMax1 > zMin2)
||
解读为OR):isOverlapping = (x1min < x2max AND x2min < x1max AND y1min < y2max AND y2min < y1max)
。 - brittohalloranA = [xmin,ymin,xmax,ymax]
B = [xmin,ymin,xmax,ymax]
// True if intersecting
!(A[0] > B[2] || A[2] < B[0] || A[1] > B[3] || A[3] < B[1])