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