2012-06-03 1 views
2

Comment convertir les systèmes de coordonnées cartésiennes et polaires (et arrière) dans l'espace 3D? De préférence avec un exemple C# mais tout serait vraiment apprécié. Merci!Cartesian to Polar (coordonnées 3d)

Modifier Lorsque 20% du changement est pris en compte (ne formant pas une sphère)

enter image description here

Modifier 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

De préférence nous montrer ce que vous avez essayé jusqu'à présent ... – Shai

+1

Pourquoi le vote à la baisse (celui qui a fait)? Je demande parce que je n'ai aucune idée de comment faire cela, et il ne semble pas y avoir une question qui inclut la 3ème dimension sur ce site ... – Darestium

+0

De quel système de coordonnées polaires parlez-vous ici? Cylindrique? Sphérique? –

Répondre

5

Fro m cartésien polaire:

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

De Polar à cartésien:

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

Je ne l'ai pas encore testé.

Vous pouvez réécrire pour réduire le nombre d'opérations en virgule flottante.

+0

Merci! Sur le second bloc de première ligne, je suppose que vous vouliez dire 'x'? – Darestium

+0

@Darestium Dernière ligne est x – nhahtdh

+0

@Darestium: J'ai édité le poste afin qu'il n'y ait pas de confusion. – nhahtdh

0

Cela dépend de la façon dont l'azimut est mesuré - à partir du plan horizontal ou de l'axe vertical. J'ai lu l'article Wikipedia, mais si vous le mesurez comme latitude géographique (Equateur = 0, Polonais = + 90 et -90) alors vous devriez utiliser asin et sin. J'utilise C# dans un logiciel de modélisation 3D et l'azimut est mesuré par rapport au plan xy et non à l'axe z. Dans mon cas, les formules sont:

lat = asin (z/r)

x = r * cos (lat) * cos (longues)

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

z = r * sin (lat)

Questions connexes