【问题标题】:Weird sign issue with mapping from cartesian to bispherical coordinates从笛卡尔坐标映射到双球坐标的奇怪符号问题
【发布时间】: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


    【解决方案1】:

    好吧,我实际上并没有给你答案,但也许只要我们齐心协力,我们就能做到。

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

    我猜我不会认为 Math 中的方法有不同的定义。这些功能已经存在了很长时间并且非常传统。也许维基百科是错误的。

    您遇到的错误类型是符号错误。所以你应该看看当一个或两个输入的符号发生变化时会发生什么。例如,如果我们翻转 x 的符号,则 phi 的符号在转换为双球时会发生变化(它移动 180 度)。相应地,在转换为笛卡尔坐标时,如果我们翻转 phi 的符号,则 x 的符号会由于 cos(phi) 而发生变化。

    但是,如果我们同时翻转 x 和 y 的符号,则 phi 的符号不会改变。其他双球计算也没有改变,因为它们只在平方中使用 x 和 y。另一方面,如果我们在转换为笛卡尔坐标时改变 phi 的符号,x 和 y 的符号确实会改变。所以笛卡尔系统中有两个点映射到相同的双球坐标,而两个对应的双球坐标确实映射回不同的笛卡尔坐标。看来您需要在 x 和 y 到 phi 的转换中引入一个符号。 (或者,可以想象其他双球坐标中的一个符号,以弥补 phi 中符号的缺失。)

    【讨论】:

    • 关于数学函数的不同我完全同意:我不认为会发生这种情况,因为它们非常标准。此外,我对 (x,y,z) 的所有 +/-1 组合进行了仔细检查,只有当 x 为负时,它才会交换 x 和 y 的符号,而不管 y 或 z 的符号如何。关于您认为笛卡尔坐标中的 2 个点映射到双球坐标中的同一点的想法,我认为这不应该是这种情况,因为它应该是一对一的映射(没有双重覆盖或类似的东西)。双球空间是正交的,包含 3 个坐标,笛卡尔也是。
    • 有趣的是,负 y 应该与负 x 对 phi 具有相同的符号变化效果。但是,该错误仅出现在负 x 上,而不出现在负 y 上。 wtf ?!
    • 所以 (+1,+1,+1) 和 (-1,-1,+1) 以及 (+1,-1,+1) 和 ( -1,+1,+1) 映射到相同的双球坐标(因此映射回来时无法区分)。现在我想知道,这是否是维基百科中的错误,或者我是否误解了这些坐标的概念,因为它们可以唯一地相互映射。
    • 我同意两个笛卡尔点不应该映射到同一个双球点。我要说的是,如果您查看维基百科上从笛卡尔到双轴的转换公式,看起来这些公式确实将两个不同的笛卡尔点映射到同一个双球点。具体来说,如果 x 和 y 都是正数,则将它们的符号都关闭为负数。换句话说,维基百科的公式似乎是错误的。
    • 我认为有必要在维基百科公式中引入符号因子。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多