ฉันจะแปลพิกัดทรงกลมเป็นพิกัดคาร์ทีเซียนได้อย่างไร


10

มีใครบางคนชี้ให้ฉันในทิศทางที่ถูกต้องว่าจะประสบความสำเร็จได้อย่างไร? คณิตศาสตร์ / เรขาคณิต 3 มิติมักทำให้ฉันขว้าง

ฉันกำลังมองหาบางสิ่งเช่นนี้ (นึกคิดใน C #):

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

คำตอบ:


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

สิ่งที่เกิดขึ้นหลังจากนั้น ... เพียงแค่ต้องคิดออกว่าจะทำอย่างไรโดยไม่ต้องมีความสามัคคีทางคณิตศาสตร์ libs ... ใด ๆ ที่แนะนำเกี่ยวกับคณิตศาสตร์ libs สำหรับ. Net ... หรือนี่คือการสร้างในบาง ฉันเห็นเฉพาะฟังก์ชั่นเหล่านี้เป็นสองเท่าเท่านั้น
สงคราม

10

  • r: ระยะรัศมี
  • θ: ความชอบ
  • φ: ราบ

ผ่าน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));
}

พิกัดทรงกลม


คุณควรทำอย่างละเอียดเกี่ยวกับความหมายของ (ตัวอักษร) กรีกในคำตอบของคุณ
เซทแบททิน

@SethBattin ขอบคุณสำหรับคำแนะนำ! คำตอบได้รับการปรับปรุง
MLM

2
สิ่งที่คุณเรียกว่าความโน้มเอียงน่าจะเป็นส่วนเสริมของความหมายของ OP สำหรับระดับความสูงเช่น มุมจากระนาบ 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เป็นพารามิเตอร์แรก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.