从笛卡尔坐标到双球坐标的怪异符号问题

问题描述 投票:1回答:2

我想将笛卡尔坐标(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的符号翻转并返回。我只是不明白为什么会这样。

有人知道这里发生了什么吗?

c# math mapping coordinate-systems
2个回答
2
投票

嗯,我实际上并没有为您找到答案,但是也许我们可以共同努力,做到这一点。

首先,在您看来,我确实正确地转录了Wikipedia公式。那么这是什么问题呢? Math函数的功能与Wikipedia中引用的功能不完全相同,或者Wikipedia中存在错误。


0
投票

好,我明白了。 Wolfram提到了一些关于半平面的事情,所以我想到使用Atan2(y,x)代替Atan(y / x)可以解决问题,并且确实可以。

© www.soinside.com 2019 - 2024. All rights reserved.