Задать вопрос
@MyOnAsSalat

Как правильно преобразовывать в сферические координаты?

Всем здравствуйте, возник вопрос по переводу декартовых координат в сферические и обратно. Просмотрел формулы на википедии, поспрашивал в чате.
Сделал конвертер:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class SphericalConverter
{
    public static Vector3 CartesianToSpherical(Vector3 cartesianCoordinates)
    {
        float x = cartesianCoordinates.x;
        float y = cartesianCoordinates.y;
        float z = cartesianCoordinates.z;
        return new Vector3(Mathf.Sqrt(x*x+y*y+z*z),Mathf.Acos(z/ Mathf.Sqrt(x * x + y * y + z * z)),  Mathf.Atan2(y,x));
    }
    public static Vector3 SphericalToCartesian(Vector3 sphericalCoordinates)
    {
        float r = sphericalCoordinates.x;
        float theta = sphericalCoordinates.y;
        float phi = sphericalCoordinates.z;
        return new Vector3(r * Mathf.Sin(theta) * Mathf.Cos(phi), r * Mathf.Sin(theta) * Mathf.Sin(phi), r * Mathf.Cos(theta));
    }

}

Проверил что работают взяв координаты точки и прогнав туда-обратно через обе функции получил ту же самую точку,
но сферические координаты задаются не по ISO (фи[0 до 360] тета [-90 до 90]), а в другом представлении (фи[0-180] тета [-180 до 180]).
Перевод нужен именно пользователю, который задаёт сферические координаты, и для просчёта длин отрезков/площадей.
Подскажите пожалуйста как исправить код к таким координатам.
  • Вопрос задан
  • 954 просмотра
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
youngmysteriouslight
@youngmysteriouslight
ТК, ТТ, JS, FP, WM
сферические координаты задаются не по ISO (фи[0 до 360] тета [-90 до 90]), а в другом представлении (фи[0-180] тета [-180 до 180]).

Точно не перепутаны местами углы? Так-то диапазон для одно из них (долгота) должен быть 360, для другого (широта) 180.

Если же поменять местами, то есть в одном случае долгота от 0 до 360 и широта от -90 до 90, а в другом долгота от -180 до 180 и широта от 0 до 180, то необходимо добавить преобразование
phi1 = phi < 180 ? phi : phi - 360;
theta1 = theta + 90;

где (phi,theta) в ISO, а (phi1,theta1) в формате пользователя. Обратное преобразование выписывается аналогично:
phi = phi1 < 0 ? phi1 + 360 : phi1;
theta = theta1 - 90;


Скажем, нужно Вам, чтобы SphericalToCartesian интерпретировала входные phi,theta в пользовательском формате. Вы пишите
float r = sphericalCoordinates.x;
        float theta = sphericalCoordinates.y;
        float phi = sphericalCoordinates.z;
        phi = phi < 0 ? phi + 360 : phi; // впрочем, конкретно эта строка не влияет на результат
        theta = theta - 90;

Аналогично для другого преобразования.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы