【问题标题】:Algorithm to check if two boxes overlap检查两个框是否重叠的算法
【发布时间】:2014-01-04 19:40:23
【问题描述】:

我已经理解了矩形的算法,但我对 x、y、z 和高度作为给定值的框感到困惑。不重叠的条件是 1) 框 B 上方的框 A 2) 框 B 下方的框 A 3) 框 B 左侧的框 A 4) Box B 右侧的 Box A

我说的对吗?请指导一些缺失的点。

【问题讨论】:

  • 您还需要检查它是在后面还是在前面。 6 次检查。
  • x,y,z 高度?那么4维?通常z是高度,或x,或y。还是只有 x、y 和 z?
  • @ariel 谢谢.. 6 次检查
  • @Dukeling Ya z 轴通常是高度,但我读到这样的问题很困惑。

标签: algorithm


【解决方案1】:

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

上图中的蓝色和绿色框重叠,因为它们在两个轴上的投影重叠。蓝色和橙色框不重叠,因为它们对 x 轴的投影不重叠(注意它们对 y 轴的投影do 重叠)。绿色和橙色框不重叠,因为它们对 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,如果您想将“切线”称为重叠,请切换到 <=
  • isOverlapping = (x1min < x2max && x2min < x1max && y1min < y2max && y2min < y1max) ...这更像是
  • 这个线程的问题:如果 xmax1 >= xmin2 和 xmax2 >= xmin1 我们是否甚至需要检查其他轴以查看框是否相交?我知道我遗漏了一些明显的东西,但是有人可以给我一个例子,其中两个框在 x 轴上不相交(xmax1 >= xmin2 和 xmax2 >= xmin1 评估为假)但在 y 轴上相交还是z轴?
  • @jmb7438 上面的橙色框和绿色框在x轴上相交,但在y轴上不相交,所以总体上它们不相交
  • @coproc Duh。谢谢!大声笑,我知道我错过了一些明显的东西
【解决方案2】:
if(xMin1 <= xMax2 || xMax1 >= xMin2)
 
if(yMin1 <= yMax2 || yMax1 >= yMin2)

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

所有这些条件都必须为真才能使框不重叠。

我还假设盒子边缘可以位于相同的 x、y、z 坐标上。

如果不是,就去掉等号。

if(xMin1 < xMax2 || xMax1 > xMin2)
 
if(yMin1 < yMax2 || yMax1 > yMin2)

if(zMin1 < zMax2 || zMax1 > zMin2)

【讨论】:

  • 你需要 AND 不需要 OR(我将 || 读作 OR):isOverlapping = (x1min &lt; x2max AND x2min &lt; x1max AND y1min &lt; y2max AND y2min &lt; y1max)
猜你喜欢
  • 1970-01-01
  • 2017-05-13
  • 2012-06-21
  • 2015-11-19
  • 1970-01-01
  • 2016-06-02
  • 2013-09-27
相关资源
最近更新 更多