Algorithm 球面扇形的边界框(圆锥体-球体相交)

Algorithm 球面扇形的边界框(圆锥体-球体相交),algorithm,geometry,intersection,bounding-box,Algorithm,Geometry,Intersection,Bounding Box,给定一个球形段(其半径、方向和角度),如何以最简单的方式计算其轴对齐的边界框 请注意,我对任意方向的线段感兴趣,而长方体必须是轴对齐的。紧定向边界框的计算非常简单 这个问题可以简化为球形帽的边界框,但我也找不到相应的算法 为简单起见,假设我们平移并缩放坐标系,使中心位于(0,…,0),半径为1。设u为线段的端点(因此‖u‖²=1),以弧度表示的角度为θ。蓝色部分是所有点,以便≤ 1和u·v≥ ‖uvcosθ=vcosθ。为了在d维中找到轴对齐的边界框,我们需要找到最小化/最大化每个单独坐标的2d

给定一个球形段(其半径、方向和角度),如何以最简单的方式计算其轴对齐的边界框

请注意,我对任意方向的线段感兴趣,而长方体必须是轴对齐的。紧定向边界框的计算非常简单

这个问题可以简化为球形帽的边界框,但我也找不到相应的算法


为简单起见,假设我们平移并缩放坐标系,使中心位于(0,…,0),半径为1。设u为线段的端点(因此‖u‖²=1),以弧度表示的角度为θ。蓝色部分是所有点,以便≤ 1和u·v≥ ‖uvcosθ=vcosθ。为了在d维中找到轴对齐的边界框,我们需要找到最小化/最大化每个单独坐标的2d向量v,即给定一个向量e,使得+e或−e属于轴向基础(例如,e=(0,−1,0,…,0))我们希望最大化evv的限制

maximize e·v
subject to
‖v‖² ≤ 1
u·v ≥ ‖v‖ cos θ
maximize e·(αe + βu)
subject to
‖αe + βu‖² = 1
u·(αe + βu) ≥ cos θ
我们首先观察到,由于目标是线性的,其他点位于这些点的凸组合上,因此在不丧失一般性的情况下,‖v‖=0或‖v‖=1。让我们关注后一种情况

maximize e·v
subject to
‖v‖² = 1
u·v ≥ cos θ
其次,存在一个最优解,它位于eu所跨越的空间中。给定任何最优解,我们可以将正交投影带到该空间,而不增加其范数或用eu改变点积,因此投影也是可行的和最优的

因此,我们通过让veu来重写系数α和β方面的问题

maximize e·v
subject to
‖v‖² ≤ 1
u·v ≥ ‖v‖ cos θ
maximize e·(αe + βu)
subject to
‖αe + βu‖² = 1
u·(αe + βu) ≥ cos θ
让我们扩大产品范围,并利用以下事实:e
>e
>u
>1

maximize α + β(e·u)
subject to
α² + 2αβ(e·u) + β² = 1
α(e·u) + β ≥ cos θ
现在我们有一个案例分析。忽略线性约束,目标最多为1,因此解α=1和β=0(即v=e)是最优的。只有当e·u≥ cosθ


如果此解决方案不可行,则线性约束必须严格:α(e·u)+β=cosθ,或β=cosθ− α(e·u)。然后我们可以代入,求解得到的二次方程,然后采用得分更好的解(除非他们都得分为负,在这种情况下,界为0)。

根据David的答案,我实现了这个算法,它似乎工作得很好:

Box计算球体分段边界框(常量向量3&u,常量浮动角度)
{
常数浮点cosAngle=cosf(角度);//cosθ
常数自动解算轴=[&](常数向量3&e)
{
常量浮点eu=Vec3::点(e,u);//e·u
如果(eu>=cosAngle)
{
返回1.0f;
}
//求解a²+2a(cosθ-a(e·u))(e·u)+(cosθ-a(e·u))²=1
常数浮点数=(余角*余角-1.0f)/(余角*余角-1.0f);
如果(det>=0.0f)
{
常数浮点a=sqrtf(数据);
//最大化x=a+b(e·u)
常数浮点x0=(余角-a*eu)*eu+a;
常量浮点x1=(余角+a*eu)*eu-a;
回位夹(最大(x0,x1),0.0f,1.0f);
}
返回0.0f;
};
Vec3-boxMin
{
最小值(0.0f,-溶解轴(Vec3(-1,0,0)),
最小值(0.0f,-解算轴(Vec3(0,-1,0)),
最小值(0.0f,-坐标轴(Vec3(0,0,-1)))
};
Vec3-boxMax
{
最大值(0.0f,解算轴(Vec3(1,0,0)),
最大值(0.0f,解算轴(Vec3(0,1,0)),
最大值(0.0f,解算轴(Vec3(0,0,1)))
};
返回{boxMin,boxMax};
}

不清楚您想要的是圆锥体的哪一部分,是整个圆锥体包括顶部的球形部分,只是该部分还是实际的圆锥体?@Makogan我对整个蓝色形状感兴趣,包括球形帽,而不仅仅是圆锥体,这是一个更简单的问题。@Witek902看,它并没有回答您的问题,但您可能会感兴趣地阅读它(以防您将在3D中的球形帽锥上构建东西…),感谢您的快速回复和深入分析!在一个单独的回答中,我发布了基于您的解决方案的算法的源代码。希望它是正确的。