Как перевести сферическую координату в декартову?

10

Может ли кто-нибудь указать мне правильное направление относительно того, как этого можно достичь? 3D математика / геометрия часто бросает меня.

Я ищу что-то вроде этого (в идеале в C #):

public Vector3 getCartesianFor(float elevation, float asimuth, float polar)
{
   return ????;
}
война
источник

Ответы:

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
источник
Именно то, что было после ... просто нужно выяснить, как это сделать без математических библиотек единства ... кто-нибудь рекомендует математические библиотеки для .Net ... или это где-то встроено? Я мог видеть только эти функции для двойников.
Война
10

  • r: радиальное расстояние
  • θ: наклон
  • φ: азимут

через википедию

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

Сферические координаты

MLM
источник
В своем ответе вы должны уточнить значения (буквального) греческого языка.
Сет Баттин,
@SethBattin Спасибо за предложение! Ответ был обновлен.
MLM
2
То, что вы называете склонностью , вероятно, является дополнением к тому, что ОП означает для возвышения , т.е. угол от плоскости xy к вектору, а не от вектора к оси z.
MestreLion
0

Если под polarвами подразумевается величина вектора, и elevationона определяется как угол между вектором и плоскостью xy (как следует из названия), функция будет иметь вид:

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

Обратите внимание, что это очень похоже на ответ MLM, все зависит от того, как вы определяете свой elevationугол. Я также уважал вашу подпись шаблона функции, но я предлагаю несколько изменений:

  • asimuth опечатка, правильное написание будет azimuth
  • polarобычно относится к 2D системе координат (r, θ). Величина вектора обычно называетсяradius
  • Более обычный порядок будет иметь radiusв качестве первого параметра.
MestreLion
источник