Làm thế nào để tôi dịch một tọa độ hình cầu sang một Cartesian?


10

Ai đó có thể chỉ cho tôi đi đúng hướng làm thế nào điều này có thể đạt được? Toán học / hình học 3D thường ném tôi.

Tôi đang tìm kiếm một cái gì đó như thế này (lý tưởng trong C #):

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

Câu trả lời:


5

http://blog.nobel-joergensen.com/2010/10/22/spherical-coordins-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);
}

Chính xác những gì sau ... chỉ cần tìm ra cách để làm điều này mà không có libs toán học thống nhất ... bất kỳ đề xuất nào về libs toán học cho .Net ... hoặc điều này được xây dựng ở đâu đó? Tôi chỉ có thể thấy các chức năng này cho đôi.
Chiến tranh

10

  • r: khoảng cách xuyên tâm
  • θ: độ nghiêng
  • φ: phương vị

thông qua 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));
}

Tọa độ hình cầu


Bạn nên giải thích về ý nghĩa của tiếng Hy Lạp (nghĩa đen) trong câu trả lời của bạn.
Seth Battin

@SethBattin Cảm ơn bạn đã gợi ý! Câu trả lời đã được cập nhật.
MLM

2
Những gì bạn gọi là độ nghiêng có lẽ là phần bổ sung cho ý nghĩa của OP đối với độ cao , tức là. góc từ mặt phẳng xy đến vectơ, không từ vectơ đến trục z.
MestreLion

0

Nếu theo polarbạn có nghĩa là độ lớn của vectơ và elevationđược định nghĩa là góc giữa vectơ và mặt phẳng xy (như tên ngụ ý), hàm sẽ là:

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

Lưu ý rằng điều này rất giống với câu trả lời của MLM, tất cả phụ thuộc vào cách bạn xác định elevationgóc của mình . Tôi cũng đã tôn trọng chữ ký mẫu chức năng của bạn, nhưng tôi đề nghị một vài thay đổi:

  • asimuth là một lỗi đánh máy, đúng chính tả sẽ là azimuth
  • polarthường đề cập đến hệ tọa độ 2D (r, θ). Độ lớn của vectơ thường được gọi làradius
  • Một đơn hàng thông thường hơn sẽ có radius như là tham số đầu tiên.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.