找到两个重叠立方体对象占用的共享空间的最有效方法是什么?
我不一定在寻找源代码,只是关于如何解决它的一般想法。
为简化起见,算法不必考虑旋转的立方体。
答案 0 :(得分:5)
两个非旋转立方体的重叠仍然是一个“盒子”。如果方框A的两个角点是(x,y,z)和(x',y',z')(x'> x,y'> y,z& #39;> z)和方框B的两个角点是(a,b,c)和(a',b',c')(a'> a,b&# 39;> b,c&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< a< x< x')然后没有重叠,发生的是max(a,x)= x> min(a',x')= a',因此差异变为负值且音量为零(因此外部最大(...,0))项。这同样适用于其他两个轴。
答案 1 :(得分:3)
如果立方体未旋转(轴对齐),则尺寸的重叠足以描述立方体的重叠。
从2个维度考虑问题:
________
| S2 |
____|___ |
| | | |
| |___|____|
| S1 |
|________|
重叠区域由S1.xmax-S2.xmin的宽度和S1.ymax-S2.ymin的高度描述。要确定减法的顺序,需要进行几次if
次测试。您可能会发现根本没有重叠。要对多维数据集执行此操作,请考虑除x和y之外的z维度。
答案 2 :(得分:2)
计算每个立方体的每个维度的最小值/最大值,然后将它们相互测试,例如在x方向上,立方体标记为1和2
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 ++中实现了上述方法并确认它可以正常工作。
答案 3 :(得分:0)
我有同样的问题,这是出现的最好的话题,但是最好的答案不能解决这个问题。一段时间后,我解决了。 Antti答案将体积计算为标量,而不是定义重叠的立方体点。使用他的定义来定义一个多维数据集,以获取两个重叠的多维数据集对象所占用的共享空间,该共享多维数据集为:
让框A为向量(Ax,Ay,Az),而A'为(Ax',Ay',Az')与(Ax'> Ax,Ay'> Ay,Az'> Az)
让框B为向量(Bx,By,Bz),B'为(Bx',By',Bz'),其中(Bx'> Bx,By'> By,Bz'> Bz)
让框C成为我们新的重叠立方体
则两个立方体之间的交点为: C = Min(A',B'); C'= Max(A,B);
请注意,如果框仅在单个点接触,则C = C'。如果只有一个维度是不同的,则在一条线上进行触摸;如果只有两个维度是不同的,则在一个平面上进行触摸。