Jak przetłumaczyć sferyczną współrzędną na kartezjańską?


10

Czy ktoś mógłby wskazać mi właściwy kierunek, w jaki sposób można to osiągnąć? Matematyka / geometria 3D często mnie rzuca.

Szukam czegoś takiego (najlepiej w C #):

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

Odpowiedzi:


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

Dokładnie to, co było po ... po prostu dowiedzieć się, jak to zrobić bez bibliotek matematycznych jedności ... jakieś zalecenia dotyczące bibliotek matematycznych dla .Net ... czy jest to gdzieś wbudowane? Widziałem te funkcje tylko dla podwójnych.
Wojna

10

  • r: odległość promieniowa
  • θ: nachylenie
  • φ: azymut

za pośrednictwem Wikipedii

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

Współrzędne sferyczne


W swojej odpowiedzi powinieneś rozwinąć znaczenie (dosłownie) greckiego.
Seth Battin,

@SethBattin Dziękujemy za sugestię! Odpowiedź została zaktualizowana.
MLM

2
To, co nazywacie nachyleniem, jest prawdopodobnie uzupełnieniem tego, co oznacza OP dla podniesienia , tj. kąt od płaszczyzny xy do wektora, a nie od wektora do osi Z.
MestreLion,

0

Jeśli polarmasz na myśli wielkość wektora i elevationjest zdefiniowany jako kąt między wektorem a płaszczyzną xy (jak sama nazwa wskazuje), funkcja wyglądałaby następująco:

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

Zauważ, że jest to bardzo podobne do odpowiedzi MLM, wszystko zależy od tego, jak zdefiniujesz swój elevationkąt. Przestrzegałem również podpisu szablonu funkcji, ale sugeruję kilka zmian:

  • asimuth to literówka, poprawna pisownia to azimuth
  • polarZazwyczaj dotyczy współrzędnej 2D systemu (R, θ). Wielkość wektora jest powszechnie określana jakoradius
  • radiusPierwszym parametrem byłby bardziej konwencjonalny porządek .
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.