Comment traduire une coordonnée sphérique en coordonnée cartésienne?

10

Quelqu'un pourrait-il m'indiquer dans la bonne direction comment cela pourrait être réalisé? Les mathématiques et la géométrie 3D me jettent souvent.

Je cherche quelque chose comme ça (idéalement en C #):

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

Réponses:

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
la source
Exactement ce qui était après ... juste besoin de comprendre comment faire cela sans les bibliothèques mathématiques d'unité ... tout recommande sur les bibliothèques mathématiques pour .Net ... ou est-ce intégré quelque part? Je ne pouvais voir ces fonctions que pour les doubles.
Guerre du
10

  • r: distance radiale
  • θ: inclinaison
  • φ: azimut

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

Coordonnées sphériques

MLM
la source
Vous devriez expliquer la signification du grec (littéral) dans votre réponse.
Seth Battin
@SethBattin Merci pour la suggestion! La réponse a été mise à jour.
MLM
2
Ce que vous appelez l' inclinaison est probablement le complément de ce que OP signifie pour l' élévation , c'est-à-dire. l'angle du plan xy au vecteur, et non du vecteur à l'axe z.
MestreLion
0

Si polarvous entendez la magnitude du vecteur, et elevationest défini comme l'angle entre le vecteur et le plan xy (comme son nom l'indique), la fonction serait:

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

Notez que cela est très similaire à la réponse de MLM, tout dépend de la façon dont vous définissez votre elevationangle. J'ai également respecté la signature de votre modèle de fonction, mais je suggère quelques modifications:

  • asimuth est une faute de frappe, l'orthographe correcte serait azimuth
  • polarse réfère généralement au système de coordonnées 2D (r, θ). La magnitude du vecteur est communément appeléeradius
  • Un ordre plus conventionnel aurait radiuscomme premier paramètre.
MestreLion
la source