判断包围盒是否相交

目标

判断两个物体的包围盒是否相交,这是个常见的问题,通常用于排除一些不相关的计算。

其公式是简单的,但我想对其进行一些“推导”或说“讨论”,来加深对公式的理解。

参考资料:《包围盒是否相交判断_包子的博客-CSDN博客》

一维的情况

先将问题简化成一个维度的情况,此时问题变成了两个区间是否有相交。

设A区间为 [ A m i n , A m a x ] [A_{min},A_{max}] [Amin,Amax],设B区间为 [ B m i n , B m a x ] [B_{min},B_{max}] [Bmin,Bmax]

如何判断“相交”可能不好想象,但是其相反问题——如何判断“不相交”,则容易想象。
“不相交”只可能有两种情况:

1)A区间整体在B区间的左边:
在这里插入图片描述

即: A m a x < B m i n A_{max}<B_{min} Amax<Bmin

2)A区间整体在B区间的右边:
在这里插入图片描述
即: A m i n > B m a x A_{min}>B_{max} Amin>Bmax

也就是说:
不 相 交 = ( A m a x < B m i n ) 或 ( A m i n > B m a x ) 不相交=(A_{max}<B_{min})或(A_{min}>B_{max}) =(Amax<Bmin)(Amin>Bmax)

那么其相反的情况,即可以通过德·摩根定律(或者说“反演律”)得到:
相 交 = ( A m a x > B m i n ) 且 ( A m i n < B m a x ) 相交=(A_{max}>B_{min})且(A_{min}<B_{max}) =(Amax>Bmin)(Amin<Bmax)

二维的情况

现在将一维的情况升为二维,此时问题变成了两个矩形是否有相交。

设A矩形为 ( A x m i n , A y m i n ) , ( A x m a x , A y m a x ) (Ax_{min},Ay_{min}),(Ax_{max},Ay_{max}) (Axmin,Aymin),(Axmax,Aymax),B矩形为 ( B x m i n , B y m i n ) , ( B x m a x , B y m a x ) (Bx_{min},By_{min}),(Bx_{max},By_{max}) (Bxmin,Bymin),(Bxmax,Bymax)

可以想象,如果只有一个轴满足“相交”而另一个轴上不相交,则矩形并不会相交:
在这里插入图片描述
矩形相交的条件是必须两个轴上都相交:
在这里插入图片描述
即:

相 交 = x 轴 上 相 交 且 y 轴 上 相 交 = ( ( A x m a x > B x m i n ) 且 ( A x m i n < B x m a x ) ) 且 ( ( A y m a x > B y m i n ) 且 ( A y m i n < B y m a x ) ) = ( A x m a x > B x m i n ) 且 ( A x m i n < B x m a x ) 且 ( A y m a x > B y m i n ) 且 ( A y m i n < B y m a x ) \begin{aligned} 相交 & =x轴上相交且y轴上相交\\ & =((Ax_{max}>Bx_{min})且(Ax_{min}<Bx_{max}))且((Ay_{max}>By_{min})且(Ay_{min}<By_{max}))\\ & =(Ax_{max}>Bx_{min})且(Ax_{min}<Bx_{max})且(Ay_{max}>By_{min})且(Ay_{min}<By_{max})\\ \end{aligned} =xy=((Axmax>Bxmin)(Axmin<Bxmax))((Aymax>Bymin)(Aymin<Bymax))=(Axmax>Bxmin)(Axmin<Bxmax)(Aymax>Bymin)(Aymin<Bymax)

三维的情况

很容易想象,三维的情况只不过是比二维多考虑了一个轴向,即:
相 交 = x 轴 上 相 交 且 y 轴 上 相 交 且 z 轴 上 相 交 = ( ( A x m a x > B x m i n ) 且 ( A x m i n < B x m a x ) ) 且 ( ( A y m a x > B y m i n ) 且 ( A y m i n < B y m a x ) ) 且 ( ( A z m a x > B z m i n ) 且 ( A z m i n < B z m a x ) ) = ( A x m a x > B x m i n ) 且 ( A x m i n < B x m a x ) 且 ( A y m a x > B y m i n ) 且 ( A y m i n < B y m a x ) 且 ( A z m a x > B z m i n ) 且 ( A z m i n < B z m a x ) \begin{aligned} 相交 & =x轴上相交且y轴上相交且z轴上相交\\ & =((Ax_{max}>Bx_{min})且(Ax_{min}<Bx_{max}))且((Ay_{max}>By_{min})且(Ay_{min}<By_{max}))且((Az_{max}>Bz_{min})且(Az_{min}<Bz_{max}))\\ & =(Ax_{max}>Bx_{min})且(Ax_{min}<Bx_{max})且(Ay_{max}>By_{min})且(Ay_{min}<By_{max})且(Az_{max}>Bz_{min})且(Az_{min}<Bz_{max})\\ \end{aligned} =xyz=((Axmax>Bxmin)(Axmin<Bxmax))((Aymax>Bymin)(Aymin<Bymax))((Azmax>Bzmin)(Azmin<Bzmax))=(Axmax>Bxmin)(Axmin<Bxmax)(Aymax>Bymin)(Aymin<Bymax)(Azmax>Bzmin)(Azmin<Bzmax)

更高维的情况以此类推。

猜你喜欢

转载自blog.csdn.net/u013412391/article/details/114271222