2012-06-03 5 views
2

Как вы конвертируете между декартовыми и полярными (и задними) системами координат в 3D-пространстве? Предпочтительно с примером C#, но что-то действительно ценится. Благодаря!Декартово-полярное (3d-координаты)

Редактировать При 20% изменение учитывается (не образуя сферу)

enter image description here

Редактировать 2

private void Spherise() { 
     for (int i = 0; i < vertices.Count; i++) { 
      float radius = this.radius; 
      float longitude = 0; 
      float latitude = 0; 

      float sphereRadius = 32; 

      Color color = vertices[i].Color; 

      ToPolar(vertices[i].Position - centre, out radius, out longitude, out latitude); 
      Vector3 position = ToCartesian(sphereRadius, longitude, latitude) + centre; 

      Vector3 normal = vertices[i].Position - centre; 
      normal.Normalize(); 

      const float lerpAmount = 0.6f; 
      Vector3 lerp = (position - vertices[i].Position) * lerpAmount + vertices[i].Position; 
      vertices[i] = new VertexPositionColorNormal(lerp, color, normal); 
     } 
    } 

    private void ToPolar(Vector3 cart, out float radius, out float longitude, out float latitude) { 
     radius = (float)Math.Sqrt((double)(cart.X * cart.X + cart.Y * cart.Y + cart.Z * cart.Z)); 
     longitude = (float)Math.Acos(cart.X/Math.Sqrt(cart.X * cart.X + cart.Y * cart.Y)) * (cart.Y < 0 ? -1 : 1); 
     latitude = (float)Math.Acos(cart.Z/radius) * (cart.Z < 0 ? -1 : 1); 
    } 

    private Vector3 ToCartesian(float radius, float longitude, float latitude) { 
     float x = radius * (float)(Math.Sin(latitude) * Math.Cos(longitude)); 
     float y = radius * (float)(Math.Sin(latitude) * Math.Sin(longitude)); 
     float z = radius * (float)Math.Cos(latitude); 

     return new Vector3(x, y, z); 
    } 

enter image description here

+0

Предпочтительно показать нам, что вы пробовали до сих пор ... – Shai

+1

Почему голосующий (кто бы это ни сделал)? Я спрашиваю, потому что я понятия не имею, как это сделать, и не возникает вопроса, который включает в себя 3-е измерение на этом сайте ... – Darestium

+0

О какой полярной системе координат вы говорите здесь? Цилиндрическая? Сферическая? –

ответ

5

Фро м декартовой в полярную:

r = sqrt(x * x + y * y + z * z) 
long = acos(x/sqrt(x * x + y * y)) * (y < 0 ? -1 : 1) 
lat = acos(z/r) 

от полярных до декартовой:

x = r * sin(lat) * cos(long) 
y = r * sin(lat) * sin(long) 
z = r * cos(lat) 

Я не проверял еще.

Вы можете переписать, чтобы уменьшить количество операций с плавающей запятой.

+0

Спасибо! На первом строчке второго блока я предполагаю, что вы имели в виду «x»? – Darestium

+0

@Darestium Последняя строка x – nhahtdh

+0

@Darestium: Я отредактировал сообщение, чтобы не было путаницы. – nhahtdh

0

Это зависит от того, как измеряется азимут - от горизонтальной плоскости или от вертикальной оси. Я читал статью в Википедии, но если вы измеряете ее как географическую широту (Equator = 0, Poles = + 90 и -90), то вы должны использовать asin и sin.

Я использую C# в программном обеспечении 3D-моделирования, и там азимут измеряется относительно xy-Plane, а не z-оси. В моем случае формулы:

лат = ASIN (г/г)

х = г * сов (лат) * COS (длинные)

у = г * сов (лат) * sin (длинный)

г = г * грех (лат)