假设我们已经给出了实心矩形框中心的坐标,框的长度,宽度,高度以及具有给定中心和半径的实心球。
是否有 快速 方式来检查该框是否是球的子集?我想到的唯一简单方法是检查8个角顶点中的每一个是否位于球体内。如果是,则该框确实是球的子集(通过球的凸性属性)。
答案 0 :(得分:0)
只有4个角要检查,但事实上你只需要检查2个彼此对角的角。这是从具有直边的矩形的属性得出的,而圆是凸的,如你所述。
或者,考虑如果左上角和右下角都在圆内,则它们形成的矩形为boudning box。圆圈显然不是,因此矩形必须是圆的子区域。
编辑:你可能在谈论一个盒子和一个球体,在这种情况下适用相同的想法,你只需要选择具有不同x,y和z值的点
答案 1 :(得分:0)
如果您希望大多数情况下盒子不在球体内,您可以进行一些快速测试:
if (sphere.center.x+sphere.radius<box.center.x-box.size.x) return false;
if (sphere.center.x-sphere.radius>box.center.x+box.size.x) return false;
etc.
如果您希望盒子通常远离球体,您可以进行其他快速测试:
bsx = box.size.x;
bsy = box.size.y;
bsz = box.size.z;
box_radius = sqrt(bsx*bsx+bsy*bsy+bsz*bsz)/2;
brx = box.center.x-sphere.center.x;
bry = box.center.y-sphere.center.y;
brz = box.center.z-sphere.center.z;
box_dist = sqrt(brx*brx+bry*bry+brz*brz);
if (box_radius+box_dist<sphere.radius) return true;
如果快速测试失败,您仍然需要更精确的测试。