2011-04-05 188 views
4

找到两个重叠立方体对象所占用的共享空间的最有效方法是什么?查找两个重叠立方体的共享体积

我不一定在寻找源代码,只是关于它应该如何解决的一般想法。

为了简化,算法不必考虑旋转的立方体。

回答

2

计算每个立方体每个维度的最小值/最大值,然后相互测试这些值。在立方体标记为1和2的x方向上

XminInt; 
if (Xmin1 > Xmax2) 
{ 
    // no intersection 
} 
else if (Xmin1 >= Xmin2) 
{ 
    // possible cube intersection 
    XminInt = Xmin1; 
} 
else if (Xmin2 <= Xmax1) 
{ 
    // possible cube intersection 
    XminInt = Xmin2; 
} 

对y和z做最大和重复的操作。如果你在任何路口遇到不相交的情况,那么你可以提前退出。如果您在六个可能的早期退出条款中没有提前退出,那么您将拥有交点立方体的全部六个定义值,即每个维度的最小/最大值。

六个早期回报几乎是一个separating axis方法的最简单的例子。由于你的形状是立方体并且是轴对齐的,所以笛卡尔轴是可能的分离轴。那么测试就是比较上述最小/最大值的一个简单问题。

请注意,我已经在C++中实现了上述方法,并确认它的工作原理。

+0

这将适用于AABBs。如果一个或两个立方体与笛卡尔坐标轴不对齐,情况如何? – mfaieghi 2017-10-10 22:15:19

3

如果立方体未旋转(轴对齐),则尺寸的重叠足以描述立方体的重叠。

考虑2名维问题:

 ________ 
    | S2 | 
____|___  | 
| | | | 
| |___|____| 
| S1  | 
|________| 

重叠区域是由S1.xmax的宽度描述 - S2.xmin,和S1.ymax的高度 - S2.ymin。要确定减法的顺序,需要一些if测试。你可能会发现没有任何重叠。要为立方体执行此操作,请考虑除x和y之外的z尺寸。

5

两个非旋转立方体的重叠仍然是一个“盒子”。如果框A的两个角点是(x,y,z)和(x',y',z')(x'> x,y'> y,z'> z)并且框B的两个角点是(A,b,C)和(A 'b',C ')(A'> A,b '> b,C'> C),则重叠量是

max(min(a',x')-max(a,x),0) 
* max(min(b',y')-max(b,y),0) 
* max(min(c',z')-max(c,z),0) 

如何读取公式:

重叠开始于X轴上两个坐标x和a的最大值处,并以a和x的最小值结束。如果'< x(即一个< a'< x'< x'),那么没有重叠,发生的是max(a,x)= x> min(a',x')= a'变成负数,音量为零(因此是外部最大(...,0))项。其他两个轴也是如此。