Как правильно преобразовывать в сферические координаты? Всем здравствуйте, возник вопрос по переводу декартовых координат в сферические и обратно. Просмотрел формулы на википедии, поспрашивал в чате.
Сделал конвертер: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]).
Перевод нужен именно пользователю, который задаёт сферические координаты, и для просчёта длин отрезков/площадей.
Подскажите пожалуйста как исправить код к таким координатам.

21 Авг 2019 в 06:06
207 +1
1
Ответы
1

Для перевода в другое представление сферических координат вам нужно просто поменять способ вычисления углов theta и phi в методе CartesianToSpherical. Вот как это можно сделать:

public static class SphericalConverter
{
public static Vector3 CartesianToSpherical(Vector3 cartesianCoordinates)
{
float x = cartesianCoordinates.x;
float y = cartesianCoordinates.y;
float z = cartesianCoordinates.z;
float r = Mathf.Sqrt(x*x + y*y + z*z);
float phi = Mathf.Acos(z / r); // от 0 до 180 градусов
float theta = Mathf.Atan2(y, x); // от -180 до 180 градусов
// Преобразование theta к интервалу [-180, 180]
theta = theta * Mathf.Rad2Deg;
if (theta > 180)
{
theta -= 360;
}
return new Vector3(r, phi * Mathf.Rad2Deg, theta);
}
public static Vector3 SphericalToCartesian(Vector3 sphericalCoordinates)
{
float r = sphericalCoordinates.x;
float phi = sphericalCoordinates.y * Mathf.Deg2Rad;
float theta = sphericalCoordinates.z * Mathf.Deg2Rad;
return new Vector3(r * Mathf.Sin(phi) * Mathf.Cos(theta), r * Mathf.Sin(phi) * Mathf.Sin(theta), r * Mathf.Cos(phi));
}
}

Теперь у вас будет правильное преобразование в другое представление сферических координат. Не забудьте также обновить способы использования этих координат в вашем проекте для корректного отображения и расчетов.

20 Апр в 13:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 93 190 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир