我有一个截头锥体(截断金字塔),我需要为这个截锥体计算一个尽可能小的边界球体。我可以选择中心位于平截头体的中心,半径是距离“远”角之一的距离,但通常会在平截头体的窄端留下相当多的松弛
这看起来像简单的几何,但我似乎无法弄明白。有什么想法吗?
答案 0 :(得分:5)
这可能不是您正在寻找的答案,但您可以计算平截头体的所有顶点并将其插入一般的最小边界球算法,如the miniball implementation。
答案 1 :(得分:5)
嗯,当然有http://www.cgafaq.info/wiki/Minimal_enclosing_sphere(通过谷歌)。
我认为有两种可能性。一个(如果平截头体非常平坦)将是基座的相对点成为球体上的相对点。另一个(如果平截头体非常高)将是平截头体的相对点将在球体上,并且您将从这四个点(基部上的一个点,基部上的第一个点对面的一个点)找出球体,一个与较高的正方形上的第一个相对,一个与较高的正方形上的第一个相邻。)
找出第一个球体。如果视锥体适合它,那就是你的答案。否则,第二个球体就是你的答案。
答案 2 :(得分:4)
此问题有几种算法和实现(另请参阅this post)。
对于2D和3D,Gärtner's implementation可能是最快的。
对于更高的尺寸(比如说高达10,000),请查看https://github.com/hbf/miniball,这是Gärtner,Kutz和Fischer的算法实现(注意:我是其中一个-authors)。
对于非常非常高的维度,核心集(近似)算法会更快。
在您的特定应用程序中,您可能需要尝试前两种算法中的任何一种。两者都在O(n)
中以非常小的常数运行并且在数值上是稳定的。
答案 3 :(得分:2)
这样做的方法是在平截头体上找到一个适合4点的球体。如果这是一个合适的截头锥体(一个截头金字塔 - 我的坏我假设是一个圆柱形的fristum),那么你从顶部四边形的对角得到两个点,另外两个从底部四边形,与顶部两个相位不同。然后使用this获取您的球体。
答案 4 :(得分:0)
任何一组四个非共面点定义一个球体。假设你使用四面金字塔作为平截头体,有70个可能的四个点。尝试所有70个球体,看看哪个是最小的。
鉴于你的视锥体可能有一些对称性,你可以选择对角上的四个点并使用基座的解决方案。
答案 5 :(得分:0)
你需要在平截头体中心的“垂直”线上找到一个点,其中到平截头体底部和顶部边缘的距离(假设它是对称的)是相同的。
解决使得底部的点是Xb,Yb,Zb,顶部的点是Xt,Yt,Zt,并且该线是点Xp,Yp,Zp加上矢量Ax,By,Cz。 / p>
所以求解方程式
sqrt( (Xb - (Xp + VAx) )^2 + (Yb - (Yp + VBy))^2 + (Zb - (Zp + VCy))^2) =
sqrt( (Xt - (Xp + VAx) )^2 + (Yt - (Yp + VBy))^2 + (Zt - (Zp + VCy))^2).
那里唯一的变量是标量V。
答案 6 :(得分:0)
严格地说(根据this),视锥体的基部可以是任何多边形,并且严格地说,多边形甚至不必是凸的。也就是说,为了得到问题的一般解决方案,我认为您可能需要使用(几乎)所有顶点,如上所述。但是,可能存在特殊情况,其解决方案可能(如上所述)仅需要比较几个领域。我喜欢Anthony上面的链接:Megiddo提供了一个转换,他声称在O(n)(!)时间内产生了一个解决方案。还不错!
答案 7 :(得分:0)
好吧,让我们用数学解决。
使用右手Y向上坐标系(向前是-Z轴),对于具有视口宽度w,高度h,近平面n,远平面f,X轴视场角fov的平截头体,则最小边界球是
k = sqrt(1+(h/w)^2) * tan(fov/2)
if( k^2 >= (f-n)/(f+n) )
{
C = (0, 0, -f)
R = f*k
}
else
{
C = (0, 0, -0.5 * (f+n) * (1+k^2))
R = 0.5 * sqrt( (f-n)^2 + 2*(f^2+n^2)*k^2 + (f+n)^2*k^4 )
}
C是球体的中心,在视图空间中,R是半径。
如果您有兴趣,我会在我的博客中详细说明: https://lxjk.github.io/2017/04/15/Calculate-Minimal-Bounding-Sphere-of-Frustum.html