Wie übersetze ich eine sphärische Koordinate in eine kartesische?

10

Könnte mich jemand in die richtige Richtung weisen, wie dies erreicht werden könnte? 3D Mathe / Geometrie wirft mich oft.

Ich suche so etwas (idealerweise in C #):

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

Antworten:

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
quelle
Genau das, was danach war ... muss nur herausfinden, wie dies ohne die Unity Math Libs zu tun ist ... gibt es Empfehlungen für Math Libs für .Net ... oder ist dies irgendwo eingebaut? Ich konnte diese Funktionen nur für Doppel sehen.
Krieg
10

  • r: radialer Abstand
  • θ: Neigung
  • φ: Azimut

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

Sphärische Koordinaten

MLM
quelle
Sie sollten in Ihrer Antwort auf die Bedeutung des (wörtlichen) Griechischen eingehen.
Seth Battin
@ SethBattin Danke für den Vorschlag! Die Antwort wurde aktualisiert.
MLM
2
Was Sie Neigung nennen, ist wahrscheinlich die Ergänzung dessen, was OP für die Höhe bedeutet , dh. der Winkel von der xy-Ebene zum Vektor, nicht vom Vektor zur z-Achse.
MestreLion
0

Wenn polarSie damit die Größe des Vektors meinen und elevationals Winkel zwischen dem Vektor und der xy-Ebene definiert sind (wie der Name schon sagt), lautet die Funktion:

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

Beachten Sie, dass dies der Antwort von MLM sehr ähnlich ist. Alles hängt davon ab, wie Sie Ihren elevationWinkel definieren . Ich habe auch die Signatur Ihrer Funktionsvorlage respektiert, schlage jedoch einige Änderungen vor:

  • asimuth ist ein Tippfehler, wäre die richtige Schreibweise azimuth
  • polarin der Regel bezieht sich auf das 2D - Koordinatensystem (r, θ). Die Größe des Vektors wird üblicherweise als bezeichnetradius
  • Eine konventionellere Reihenfolge hätte radiusals ersten Parameter.
MestreLion
quelle