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 ????;
}
Wojna
źródło

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);
}
AttackingHobo
źródło
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

MLM
źródło
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 .
MestreLion
źródło