Geometry 测试立方体是否在球体内-最快方法

Geometry 测试立方体是否在球体内-最快方法,geometry,hittest,octree,Geometry,Hittest,Octree,有没有比单独测试8个角是否在球体内部更快的方法来检查轴对齐立方体是否在球体内部 我正在穿过一个八叉树,检查它的立方体叶子是否在一个球体内相交或封闭。我在这里找到了一种处理交叉点的方法: 我希望找到一种更有效的方法来测试封闭性。我最终需要的是一个返回三种状态之一的测试: 外球面 相交球面 内球面 立方体由两个点定义,球体由其中心点和半径定义。您可以测量立方体中心到球体中心的距离。结合立方体对角线的长度和球体的半径,您可以确定立方体是否在球体内。要确定立方体是否完全在球体内,您可以只测试一个顶点,即

有没有比单独测试8个角是否在球体内部更快的方法来检查轴对齐立方体是否在球体内部

我正在穿过一个八叉树,检查它的立方体叶子是否在一个球体内相交或封闭。我在这里找到了一种处理交叉点的方法:

我希望找到一种更有效的方法来测试封闭性。我最终需要的是一个返回三种状态之一的测试:

  • 外球面
  • 相交球面
  • 内球面

  • 立方体由两个点定义,球体由其中心点和半径定义。

    您可以测量立方体中心到球体中心的距离。结合立方体对角线的长度和球体的半径,您可以确定立方体是否在球体内。

    要确定立方体是否完全在球体内,您可以只测试一个顶点,即距离球体中心最远的顶点。通过比较立方体和球体的中心点,可以确定要测试的顶点。 例如,给定一个以
    (cx,cy,cz)
    为中心的立方体,其边半长为
    l
    ,以及一个以
    (sx,sy,sz)
    为半径
    r
    的球体,则测试点为

    tx = cx + ( cx > sx ? l : -l );
    ty = cy + ( cy > sy ? l : -l );
    tz = cz + ( cz > sz ? l : -l );
    

    然而,测试立方体对球面的角不会捕捉到所有的交集情况-将立方体从(- 5,- 5,- 5)到(5,5,5)和在半径为2的(0,0,6)的球面上考虑。两个体积确实相交,但球体内没有顶点

    我会选择多通道方法:

  • 选中球体相对于立方体的轴对齐边界框- 非常简单的检查,快速拒绝 显然不是交叉案例
  • 检查球体中心是否位于立方体内
  • 这种可能性可能在您的系统中被排除,但您应该 还对球体不存在的情况执行边界框检查 完全在立方体中
  • 在这一点上,除了继续检查,别无选择

  • 不过,为了行走八叉树,我会尝试将球体视为轴对齐的边界框,并以较小的误报率生活。如果知道这比得到绝对正确的交点结果要快,我一点也不会感到惊讶。

    您可能正在检查许多立方体或球体,因为速度对您很重要。有时,可以将复杂性分摊到对象集合中,因此,是否有多个球体或多个立方体很重要。请澄清哪些物体数量众多,它们的大小是相同的还是不同的。想象一个球体沿着一条轴线与立方体的中心对齐,距离足够近,以至于球体几乎不接触立方体表面的中心。在这种情况下。立方体中心和球体之间的距离小于立方体的半径+对角线,但它们根本不相交。