Küresel bir koordinatı Kartezyen'e nasıl çevirebilirim?


10

Birisi bana bunun nasıl başarılabileceğine dair doğru yönü gösterebilir mi? 3D matematik / geometri beni sık sık atıyor.

Böyle bir şey arıyorum (ideal olarak C #):

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

Yanıtlar:


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

Tam olarak ne oldu ... sadece birlik matematik kütüphaneleri olmadan bunu nasıl anlamaya ihtiyacım var ... herhangi .Net için matematik kütüphaneleri tavsiye ... ya da bu bir yerde inşa? Bu fonksiyonları sadece çiftler için görebiliyordum.
Savaş

10

  • r: radyal mesafe
  • θ: eğim
  • φ: azimut

Wikipedia üzerinden

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

Küresel koordinatlar


Cevabınızdaki (gerçek) Yunanca'nın anlamları hakkında ayrıntılı bilgi vermelisiniz.
Seth Battin

@SethBattin Öneri için teşekkürler! Yanıt güncellendi.
MLM

2
Eğim olarak adlandırdığınız şey muhtemelen OP'nin yükseklik için ne anlama geldiğinin bir tamamlayıcısıdır . xy düzleminden vektöre açı, vektörden z eksenine değil.
MestreLion

0

Eğer polarvektörün büyüklüğünü kastediyorsanız ve elevationvektör ile xy düzlemi (adından da anlaşılacağı gibi) arasındaki açı olarak tanımlanırsa, işlev şöyle olur:

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

Bunun MLM'nin cevabına çok benzediğini unutmayın, her şey elevationaçınızı nasıl tanımladığınıza bağlıdır . İşlev şablonu imzanıza da saygı duydum, ancak birkaç değişiklik öneriyorum:

  • asimuth bir yazım hatasıdır, doğru yazım azimuth
  • polargenellikle 2B koordinat sistemini ifade eder (r, refers). Vektörün büyüklüğü genel olarakradius
  • Daha geleneksel bir düzenin radiusilk parametre olması gerekir.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.