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


10

Чи може хтось вказати мені в правильному напрямку щодо того, як цього можна досягти? 3D математика / геометрія часто мене кидає.

Я шукаю щось подібне (в ідеалі на C #):

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

Відповіді:


5

http://blog.nobel-joergensen.com/2010/10/22/spherical-coordinate-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);
}

Точно, що було після ... просто потрібно розібратися, як це зробити без математики libs ... будь-які рекомендації з математики libs для .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));
}

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


Слід сказати про значення смислу (буквально) грецької мови у своїй відповіді.
Сет Беттін

@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в якості першого параметра.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.