我有一个轴对齐的3D框(长方体),每个顶点都有一个球体(每个都有不同的半径)。如何检查框中的所有点是否都被任何球体覆盖?
我需要一种相当快速且不一定精确的算法。 假阴性 - 也就是说实际上它没有覆盖盒子 - 不是一个大问题,但我仍然想尽量减少这种错误。误报是不可接受的。
预期用途是计算由有符号距离函数指定的对象的体积。我递归地划分空间,如果一个给定的盒子完全位于对象的外部或内部,我知道我可以在这个级别停止递归。假阴性会导致框的额外分裂,但不会导致结果中的错误。
答案 0 :(得分:6)
(虽然我试图找到一个几何上最优的版本,但这是一个简单的想法,肯定会起作用,但它可能会返回一些假阴性。)
在盒子的对角相对角处考虑两个球体。每个球体具有3个或更多个点,其与盒子的边缘相交。从对角看,这些点中的一个是球体内盒子内的最远点。这意味着如果所有这些点都被相反的球体所覆盖,那么这两个球体就会覆盖整个盒子。
例1:对角线对面覆盖的所有点
如果两个球体没有覆盖整个盒子,请检查其他3对对角球体。如果其中一对覆盖盒子,那么它被8个球体覆盖。如果没有任何一对覆盖盒子,则它可能会或可能不会被8个球体覆盖(可能是假阴性)。
例2:一些未被对角线对面覆盖的点
在立方体盒子的特定情况下,两个对角相对的球体的半径覆盖整个立方体,大小为1,由下式给出:
0≤r a ≤1→r b ≥√(2 +(1 - r a ) 2 )
1≤r a ≤√2→r b ≥√(1 +(1 - √)(r a 2 - 1)) 2 )
√2≤r a ≤√3→r b ≥1 - √(r a 2 - 2)
为了避免耗时的计算,在几个点(包括1和√2处的断点)之间使用线性插值将给出保守的近似。或者你可以使用更简单但不太精确的近似r a 2 + r b 2 ≥3(下图中的蓝色圆圈。)
有一种类似的方法,你可以考虑盒子底角周围的4个球体,找到它们的表面在盒子里面创建的“风景”,然后找到这个“风景”中的最低点。如果你对顶部球体做同样的事情,并且两个风景的最小高度总和超过了盒子的高度,那么盒子就会被球体覆盖。
然后,您还可以检查左/右和前/后最小高度,看看它们是否与盒子的宽度和深度相加。如果他们中的任何一个做,那么盒子被球体覆盖。如果没有,则不确定盒子是否被遮盖(可能是假阴性)。由于这种方法同时考虑了所有球体,我认为它会比对角球体方法产生更少的假阴性。
示例3a:找到4个球体的交叉点
从上面看,任意两个球体之间的交点是圆圈的两个交叉点之间的线,球体与盒子的底边相交。
示例3b:找到交叉点上的最低点
球体之间的交叉点连接起来形成“景观”中的“山谷”。两个相邻球体之间的谷的最高点位于盒子的边缘,两个对角相对的球体之间的谷的最高点位于它们的中心之间的对角线上。所以最低点是“山谷”相遇的地方。这些点中的哪一个是最低的,取决于它们与两个最大球体的中心之间的对角线的距离。
示例3c:未完全覆盖
如果某些“山谷”不相遇,那么底部的一部分未被这4个球体覆盖,最小高度显然为零。
我一直在摆弄最小高度方法的代码,计算4个球体之间最低点所需的几何实际上非常简单:
答案 1 :(得分:0)
我认为,由于问题的复杂性,并且由于您接受错误否定,因此检查每个球体的半径是否大于主对角线的一半(r*r > a*a + b*b + c*c
)将是一个合适的解决方案。在这种情况下,每个球体至少覆盖“它”的长方体的1/8部分,因此长方体被覆盖。