Como traduzo uma coordenada esférica para uma cartesiana?

10

Alguém poderia me indicar a direção certa de como isso pode ser alcançado? A matemática / geometria 3D geralmente me joga.

Estou procurando algo parecido com isto (idealmente em c #):

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

Respostas:

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
fonte
Exatamente o que foi depois ... só preciso descobrir como fazer isso sem as bibliotecas de matemática da unidade ... alguém recomenda bibliotecas de matemática para .Net ... ou isso é construído em algum lugar? Eu só conseguia ver essas funções em duplas.
War
10

  • r: distância radial
  • θ: inclinação
  • φ: azimute

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

Coordenadas esféricas

MLM
fonte
Você deve elaborar sobre os significados do grego (literal) em sua resposta.
Seth Battin
@SethBattin Obrigado pela sugestão! A resposta foi atualizada.
MLM
2
O que você chama de inclinação é provavelmente o complemento do que significa OP para elevação , ou seja. o ângulo do plano xy para o vetor, não do vetor para o eixo z.
MestreLion
0

Se polarvocê quer dizer a magnitude do vetor e elevationé definido como o ângulo entre o vetor e o plano xy (como o nome indica), a função seria:

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

Observe que isso é muito semelhante à resposta do MLM, tudo depende de como você define seu elevationângulo. Também respeitei a assinatura do modelo de função, mas sugiro algumas alterações:

  • asimuth é um erro de digitação, a ortografia correta seria azimuth
  • polargeralmente se refere ao sistema de coordenadas 2D (r, θ). A magnitude do vetor é comumente referida comoradius
  • Uma ordem mais convencional teria radiuscomo primeiro parâmetro.
MestreLion
fonte