目标
判断两个物体的包围盒是否相交,这是个常见的问题,通常用于排除一些不相关的计算。
其公式是简单的,但我想对其进行一些“推导”或说“讨论”,来加深对公式的理解。
一维的情况
先将问题简化成一个维度的情况,此时问题变成了两个区间是否有相交。
设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} 相交=x轴上相交且y轴上相交=((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} 相交=x轴上相交且y轴上相交且z轴上相交=((Axmax>Bxmin)且(Axmin<Bxmax))且((Aymax>Bymin)且(Aymin<Bymax))且((Azmax>Bzmin)且(Azmin<Bzmax))=(Axmax>Bxmin)且(Axmin<Bxmax)且(Aymax>Bymin)且(Aymin<Bymax)且(Azmax>Bzmin)且(Azmin<Bzmax)
更高维的情况以此类推。