Come traduco una coordinata sferica in una cartesiana?


10

Qualcuno potrebbe indicarmi la giusta direzione su come raggiungere questo obiettivo? La matematica / geometria 3D mi lancia spesso.

Sto cercando qualcosa del genere (idealmente in C #):

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

Risposte:


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);
}

Esattamente quello che era dopo ... ho solo bisogno di capire come fare questo senza le librerie matematiche di unità ... qualche consiglio sulle librerie matematiche per .Net ... o è costruito da qualche parte? Ho potuto vedere solo queste funzioni per i doppi.
Guerra,

10

  • r: distanza radiale
  • θ: inclinazione
  • φ: azimut

tramite 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));
}

Coordinate sferiche


Dovresti approfondire i significati del greco (letterale) nella tua risposta.
Seth Battin,

@SethBattin Grazie per il suggerimento! La risposta è stata aggiornata
MLM

2
Quello che chiami inclinazione è probabilmente il complemento di ciò che OP significa per elevazione , cioè. l'angolo dal piano xy al vettore, non dal vettore all'asse z.
MestreLion,

0

Se polarintendi l'intensità del vettore, ed elevationè definito come l'angolo tra il vettore e il piano xy (come suggerisce il nome), la funzione sarebbe:

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));
}

Nota che questo è molto simile alla risposta di MLM, tutto dipende da come definisci il tuo elevationangolo. Ho anche rispettato la firma del modello di funzione, ma suggerisco alcune modifiche:

  • asimuth è un errore di battitura, l'ortografia corretta sarebbe azimuth
  • polardi solito si riferisce al sistema di coordinate 2D (r, θ). L'entità del vettore è comunemente indicata comeradius
  • Un ordine più convenzionale avrebbe radiuscome primo parametro.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.