【发布时间】:2020-01-28 11:40:18
【问题描述】:
我想将笛卡尔坐标 (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 和 y 分量的符号,而 {X:7,586471 Y:-6,154929 Z:1,494778} 有效很好。
很遗憾,我在我的代码中找不到错误。 该问题似乎是由原始笛卡尔坐标中的负 x 值引起的,这将导致 x 和 y 的符号在转换后翻转并返回。我只是不明白为什么会这样。
有人知道这里发生了什么吗?
【问题讨论】:
标签: c# math mapping coordinate-systems