Как перевести сферическую координату в декартовую?

Может ли кто-нибудь указать мне в правильном направлении относительно того, как это может быть достигнуто? 3D-математика /геометрия часто меня бросает.

Я ищу что-то вроде этого (идеально в C #):

public Vector3 getCartesianFor(float elevation, float asimuth, float polar)
{
   return ????;
}
10 голосов | спросил War 11 PM00000080000005731 2014, 20:59:57

3 ответа


5

http: //blog.nobel-joergensen .com /2010/10/22 /сферические координаты в единстве /

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 11 PM00000090000002331 2014, 21:02:23
9

  • r: радиальное расстояние
  • θ: наклон
  • φ: azimuth

через Википедия

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

Сферические координаты

ответил MLM 11 PM00000090000004831 2014, 21:05:48
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.
ответил MestreLion 12 AM00000030000002931 2014, 03:09:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132