Как правильно преобразовывать в сферические координаты? Всем здравствуйте, возник вопрос по переводу декартовых координат в сферические и обратно. Просмотрел формулы на википедии, поспрашивал в чате.
Сделал конвертер: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
232 +1
2
Ответы
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 Апр 2024 в 13:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир