我正在尝试以任意维度对Ritter's bounding sphere algorithm进行编码,而我仍然坚持创建一个球体,它在其边缘有3个给定点,或者换句话说,就是一个球体。由N维空间中的3个点定义。
该球体的中心将是(定义)3个点的最小距离等距点。
我知道如何在2-D(由3个点定义的三角形的中心)中解决它,我已经看到了3D的一些矢量计算,但我不知道ND的最佳方法是什么,如果它甚至可能。
(我也很欣赏有关ND中最小边界球计算的任何其他建议,以防我走向错误的方向。)
答案 0 :(得分:2)
所以,如果我做对了:
通缉点p
是同一半径r
的3个超球体之间的交点,其中超球体的中心是您的点p0,p1,p2
,半径r
是最小的所有可能的解决方案。在 n-D 中,任意点定义为(x1,x2,x3,...xn)
所以解决以下等式:
|p-p0|=r
|p-p1|=r
|p-p2|=r
其中p,r
是未知数且p0,p1,p2
是已知的。这导致3*n
方程和n+1
未知数。因此,获取所有非零r
解决方案并选择最小值。为了正确计算,从每个球体中选择一些非平凡的方程(0=r)
,形成n+1
=方程和n+1
未知数的系统并求解。
<强> [注释] 强>
为了简化处理,你可以用这种形式得到方程式:
(p.xi-p0.xi)^2=r^2
仅在找到解决方案后使用sqrt(r^2)
(忽略负半径)。
还有另一种更简单的方法:
您可以计算点p0,p1,p2
所在的平面,以便在此平面内找到这些点的u,v
坐标。然后在(u,v)
坐标上的 2D 中解决您的问题,然后将找到的解决方案(u,v)
转换回您的n-D
空间。
n=(p1-p0)x(p2-p0); // x is cross product
u=(p1-p0); u/=|u|;
v=u x n; v/=|v|; // x is cross product
如果我的记忆很好,那么转换n-D -> u,v
就像这样:
P0=(0,0);
P1=(|p1-p0|,0);
P2=(dot(p2-p0,u),dot(p2-p0,v));
其中P0,P1,P2
是 2D 点在与(u,v)
空间中的点p0,p1,p2
对应的平面的n-D
坐标系中。
转换回来就像这样:
p=(P.u*u)+(P.v*v);
答案 1 :(得分:1)
My Bounding Sphere算法仅计算3维的近似最佳球体。
Fischer有一个精确的,最小的边界超球体(N维。)见他的论文:http://people.inf.ethz.ch/gaertner/texts/own_work/seb.pdf。
他的(C ++ / Java)代码:https://github.com/hbf/miniball。
Jack Ritter jack@houseofwords.com