C# 从笛卡尔坐标到双球坐标映射的奇异符号问题

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

我想将笛卡尔坐标(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 = 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,则将两个都关闭为负。换句话说,维基百科公式似乎是错误的。我认为有必要在维基百科公式中引入符号因子。