C# 从笛卡尔坐标到双球坐标映射的奇异符号问题
我想将笛卡尔坐标(x,y,z)映射到双球坐标(sigma,tau,phi)并返回到 以下是我的职能:C# 从笛卡尔坐标到双球坐标映射的奇异符号问题,c#,math,mapping,coordinate-systems,C#,Math,Mapping,Coordinate Systems,我想将笛卡尔坐标(x,y,z)映射到双球坐标(sigma,tau,phi)并返回到 以下是我的职能: 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
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:-53434y:2569566z:-1195607}翻转X和Y分量的符号,{X:7586471y:-6154929z:149478}工作正常
很遗憾,我在代码中找不到错误。
问题似乎是由原始笛卡尔坐标中的负x值引起的,这将导致x和y的符号在转换后翻转并返回。我只是不明白为什么会这样
有人知道这里发生了什么吗?好吧,我实际上没有答案给你,但也许只要我们齐心协力,我们就能做到 首先,在我看来,你确实正确地转录了维基百科的公式。那么这是一个什么样的问题呢?要么数学函数与Wikipedia中引用的函数的作用不完全相同,要么Wikipedia中存在错误 我猜数学中的方法不会有不同的定义。这些功能已经存在很长时间了,非常传统。也许维基百科错了 您的错误类型是符号错误。所以你应该看看当一个或两个输入信号改变时会发生什么。例如,如果我们翻转x的符号,那么phi的符号在转换为双球面时会发生变化(移动180度)。相应地,在笛卡尔坐标的转换中,如果我们翻转φ的符号,那么x的符号会因为cos(φ)而改变
然而,如果我们翻转x和y的符号,那么φ的符号不会改变。其他双球计算也没有改变,因为它们在平方运算中只使用x和y。另一方面,如果我们在转换为笛卡尔坐标时改变φ的符号,x和y的符号确实会改变。因此,笛卡尔坐标系中有两个点映射到相同的双球坐标,而两个对应的双周坐标则映射回不同的笛卡尔坐标。似乎你需要在x和y到φ的转换中引入一个符号。(或者,可以想象,在另一个双球坐标中有一个符号,以弥补在φ中缺少符号。)好的,我知道了。Wolfram提到了一些关于半平面的事情,所以我想到用Atan2(y,x)而不是Atan(y/x)可以解决这个问题,它确实解决了。关于数学函数的不同,我完全同意:我不认为会发生这种情况,因为它们非常标准。此外,我对(x,y,z)的所有+/-1组合进行了双重检查,并且它仅在x为负时交换x和y的符号,而不考虑y或z的符号。关于你的想法,笛卡尔坐标系中的两个点映射到双球坐标系中的同一点,我认为情况不应该是这样,因为它应该是一对一的映射(没有双重覆盖或类似的东西)。双球面空间是正交的,与笛卡尔坐标一样包含3个坐标。有趣的是,负y对φ的影响应与负x对φ的影响相同。但是,该错误仅出现在负x上,而不出现在负y上。世界跆拳道联盟?!因此(+1,+1,+1)和(-1,-1,+1)以及(+1,-1,+1)和(-1,+1,+1)映射到相同的双球坐标(因此在映射回时无法区分)。现在我想知道,这是维基百科中的一个错误,还是我误解了这些坐标的概念,认为它们是唯一可以相互映射的。我同意两个笛卡尔点不应该映射到同一个双球点。我想说的是,如果你看维基百科上从笛卡尔坐标到双球面的转换公式,看起来这些公式确实将两个不同的笛卡尔点映射到同一个双球面点。特别是,如果x和y都是正的vs,则将两个都关闭为负。换句话说,维基百科公式似乎是错误的。我认为有必要在维基百科公式中引入符号因子。