所以如果我理解正确:
所求点
p
是三个半径相同的超球体在你的点
p0,p1,p2
上的交点,半径
r
是所有可能解的最小值。在
n维空间中,任意点被定义为
(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)
坐标系中解决问题,最后将找到的解从 (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
是平面上 p0,p1,p2
在 n-D
空间中对应的 2D 点在坐标系(u,v)中的投影。
反向转换如下所示:
p=(P.u*u)+(P.v*v)