Странная проблема знака с отображением из декартовых в бисферические координаты - PullRequest
1 голос
/ 28 января 2020

Я хочу отобразить декартовы координаты (x, y, z) в бисферические координаты (сигма, тау, фи) и обратно согласно 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 после преобразования и обратно. Я просто не понимаю, почему это происходит.

Кто-нибудь знает, что здесь происходит?

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Ну, на самом деле у меня нет ответа для вас, но, возможно, собравшись вместе, мы сможем это сделать.

Прежде всего мне кажется, что вы правильно расшифровали формулы Википедии. Так что же это за проблема? Либо функции Math не выполняют в точности то же самое, что функции, на которые ссылаются в Википедии, либо в Википедии есть ошибка.

Я бы не подумал, что методы в Math определены по-разному. Эти функции существуют уже давно и очень условны. Может быть, Википедия не так.

Тип ошибки - знак ошибки. Поэтому вы должны посмотреть, что происходит, когда знаки одного или двух входов меняются. Например, если мы перевернем знак x, то знак phi изменится (он переместится на 180 градусов) при преобразовании в бисферический. Соответственно при преобразовании в декартову, если мы перевернем знак фи, то знак х из-за кос (фи) изменится.

Однако если мы перевернем знаки x и y, то знак ph не изменится. Не изменяются и другие бисферические вычисления, поскольку они используют только x и y в квадрате. С другой стороны, если мы изменим знак фи в преобразовании в декартову, знаки х и у действительно изменятся. Таким образом, в декартовой системе есть две точки, которые отображаются на одни и те же бисферические координаты, в то время как две соответствующие бисперические координаты отображаются обратно на разные декартовы координаты. Казалось бы, вам нужно ввести знак преобразования x и y в фи. (Или, возможно, знак в одной из других бисферических координат, чтобы восполнить отсутствие знака в фи.)

0 голосов
/ 28 января 2020

Хорошо, я понял. Вольфрам упоминал кое-что о полуплоскостях, поэтому мне пришло в голову, что использование Atan2 (y, x) вместо Atan (y / x) может решить проблему, и это произошло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...