¿Cómo traduzco una coordenada esférica a una cartesiana?

10

¿Podría alguien señalarme en la dirección correcta sobre cómo se podría lograr esto? Las matemáticas / geometría 3D a menudo me arrojan.

Estoy buscando algo como esto (idealmente en C #):

public Vector3 getCartesianFor(float elevation, float asimuth, float polar)
{
   return ????;
}
Guerra
fuente

Respuestas:

5

http://blog.nobel-joergensen.com/2010/10/22/spherical-coordinates-in-unity/

public static void SphericalToCartesian(float radius, float polar, float elevation, out Vector3 outCart){
    float a = radius * Mathf.Cos(elevation);
    outCart.x = a * Mathf.Cos(polar);
    outCart.y = radius * Mathf.Sin(elevation);
    outCart.z = a * Mathf.Sin(polar);
}


public static void CartesianToSpherical(Vector3 cartCoords, out float outRadius, out float outPolar, out float outElevation){
    if (cartCoords.x == 0)
        cartCoords.x = Mathf.Epsilon;
    outRadius = Mathf.Sqrt((cartCoords.x * cartCoords.x)
                    + (cartCoords.y * cartCoords.y)
                    + (cartCoords.z * cartCoords.z));
    outPolar = Mathf.Atan(cartCoords.z / cartCoords.x);
    if (cartCoords.x < 0)
        outPolar += Mathf.PI;
    outElevation = Mathf.Asin(cartCoords.y / outRadius);
}
AttackingHobo
fuente
Exactamente lo que sucedió después ... solo necesito descubrir cómo hacer esto sin las librerías de matemáticas de la unidad ... ¿alguna recomendación sobre las librerías de matemáticas para .Net ... o está incorporada en alguna parte? Solo pude ver estas funciones para dobles.
Guerra
10

  • r: distancia radial
  • θ: inclinación
  • φ: azimut

a través de Wikipedia

public Vector3 getCartesianFor(float radius, float inclination, float azimuth)
{
   return new Vector3(radius*Sin(inclination)*Cos(azimuth), radius*Sin(inclination)*Sin(azimuth), radius*Cos(inclination));
}

Coordenadas esféricas

MLM
fuente
Debes elaborar sobre los significados del griego (literal) en tu respuesta.
Seth Battin
@SethBattin ¡Gracias por la sugerencia! La respuesta ha sido actualizada.
MLM
2
Lo que usted llama inclinación es probablemente el complemento de lo que significa OP para la elevación , es decir. El ángulo del plano xy al vector, no del vector al eje z.
MestreLion
0

Si polarse refiere a la magnitud del vector y elevationse define como el ángulo entre el vector y el plano xy (como su nombre lo indica), la función sería:

public Vector3 getCartesianFor(float elevation, float asimuth, float polar)
{
   return new Vector3(polar*Cos(elevation)*Cos(asimuth),
                      polar*Cos(elevation)*Sin(asimuth),
                      polar*Sin(inclination));
}

Tenga en cuenta que esto es muy similar a la respuesta de MLM, todo depende de cómo defina su elevationángulo. También he respetado la firma de la plantilla de función, pero sugiero algunos cambios:

  • asimuth es un error tipográfico, la ortografía correcta sería azimuth
  • polargeneralmente se refiere al sistema de coordenadas 2D (r, θ). La magnitud del vector se conoce comúnmente comoradius
  • Un orden más convencional tendría radiuscomo primer parámetro.
MestreLion
fuente