Bagaimana cara menerjemahkan koordinat bola ke koordinat Cartesian?

10

Bisakah seseorang mengarahkan saya ke arah yang benar tentang bagaimana ini bisa dicapai? Matematika 3D / geometri sering melempar saya.

Saya mencari sesuatu seperti ini (idealnya dalam C #):

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

Jawaban:

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);
}
SerangHobo
sumber
Tepatnya apa yang terjadi ... hanya perlu mencari tahu bagaimana melakukan ini tanpa lib matematika kesatuan ... ada rekomendasi pada lib matematika untuk. Net ... atau ini dibangun di suatu tempat? Saya hanya bisa melihat fungsi-fungsi ini untuk ganda.
Perang
10

  • r: jarak radial
  • θ: kecenderungan
  • φ: azimuth

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

Koordinat bola

MLM
sumber
Anda harus menguraikan arti dari bahasa Yunani (literal) dalam jawaban Anda.
Seth Battin
@SethBattin Terima kasih atas sarannya! Jawabannya telah diperbarui.
MLM
2
Apa yang Anda sebut inklinasi mungkin merupakan pelengkap dari apa yang OP maksud untuk elevasi , yaitu. sudut dari bidang xy ke vektor, bukan dari vektor ke sumbu z.
MestreLion
0

Jika yang polarAnda maksud besarnya vektor, dan elevationdidefinisikan sebagai sudut antara vektor dan bidang xy (sesuai namanya), fungsinya adalah:

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

Perhatikan bahwa ini sangat mirip dengan jawaban MLM, itu semua tergantung pada bagaimana Anda mendefinisikan elevationsudut Anda . Saya juga menghormati tanda tangan templat fungsi Anda, tetapi saya menyarankan beberapa perubahan:

  • asimuth adalah salah ketik, ejaan yang benar adalah azimuth
  • polarbiasanya mengacu pada sistem koordinat 2D (r, θ). Besarnya vektor biasanya disebut sebagairadius
  • Urutan yang lebih konvensional akan radiusmenjadi parameter pertama.
MestreLion
sumber