我想将笛卡尔坐标(x,y,z)映射到双球坐标(sigma,tau,phi),并反屈服于wikipedia。
这是我的职能:
public static Vector3 ProjectBisphericalToCartesian(Vector3 bispherical, double a)
{
var sigma = (double)bispherical.X;
var tau = (double)bispherical.Y;
var phi = (double)bispherical.Z;
var d = Math.Cosh(tau) - Math.Cos(sigma);
var s = a / d;
var x = s * Math.Sin(sigma) * Math.Cos(phi);
var y = s * Math.Sin(sigma) * Math.Sin(phi);
var z = s * Math.Sinh(tau);
return new Vector3(
(float)x,
(float)y,
(float)z
);
}
public static Vector3 ProjectCartesianToBispherical(Vector3 cartesian, double a)
{
var x = (double)cartesian.X;
var y = (double)cartesian.Y;
var z = (double)cartesian.Z;
var R = Math.Sqrt(x * x + y * y + z * z);
var s = R * R + a * a;
var t = 2.0 * a * z;
var Q = Math.Sqrt(s * s - t * t);
var sigma = Math.Acos((R * R - a * a) / Q);
var tau = Asinh(t / Q);
var phi = Math.Atan(y / x);
return new Vector3(
(float)sigma,
(float)tau,
(float)phi
);
}
// sinh^-1 ("areasinus hyperbolicus")
private static double Asinh(double x)
{
return Math.Log(x + Math.Sqrt(x * x + 1.0));
}
我通过为(x,y,z)和a生成随机数来测试函数,将它们转换为双球坐标并返回笛卡尔坐标,并检查它们是否等于原始笛卡尔坐标(最大公差为小) 。
事实证明,某些直角坐标会翻转其x和y分量的符号(z可以),而其他元素则不。例如,{X:-5,3434 Y:2,569566 Z:-1,195607}在{X:7,586471 Y:-6,154929 Z:1,494778}工作时翻转x和y分量的符号很好。
不幸的是,我找不到我的代码中的错误。问题似乎是由原始笛卡尔坐标中的负x值引起的,这将导致转换后的x和y的符号翻转并返回。我只是不明白为什么会这样。
有人知道这里发生了什么吗?
嗯,我实际上并没有为您找到答案,但是也许我们可以共同努力,做到这一点。
首先,在您看来,我确实正确地转录了Wikipedia公式。那么这是什么问题呢? Math函数的功能与Wikipedia中引用的功能不完全相同,或者Wikipedia中存在错误。
好,我明白了。 Wolfram提到了一些关于半平面的事情,所以我想到使用Atan2(y,x)代替Atan(y / x)可以解决问题,并且确实可以。