2010-03-03 8 views
0

J'ai besoin de convertir les coordonnées rectangulaires en coordonnées polaires. Pouvez-vous recommander une bibliothèque que je peux utiliser, je préférerais ne pas avoir à écrire moi-même.Paquet Java qui convertit les coordonnées rectangulaires en coordonnées polaires

Ceci est utilisé pour donner un sens aux métadonnées incluses dans les fichiers d'images d'astronomie.

+4

Umm ... le calcul devrait être simple, et il serait probablement très utile pour votre compréhension du domaine du problème si vous avez recherché les formules et les avez implémentées vous-même. –

+0

Vrai mais le problème est trivial, donc ne m'aide pas à apprendre quelque chose de nouveau. Mais si quelque chose existe qui a été utilisé, je saurai que la réponse est correcte et que j'aurais probablement des méthodes "sympas" pour faire d'autres choses ... sinon je l'écrirai bien sûr moi-même. – Ankur

Répondre

1

Je suis assez sûr que la bibliothèque standard a déjà ceci. S'il y a des types de nombres imaginaires, ils le font précisément (réel = x, imag = y, arg (val) = angle, abs (val) = rayon). Utiliser la bibliothèque mathématique (atan2, sin, cos et sqrt) n'est pas si difficile non plus.

1

n'est-ce pas comme 2 fonctions? vous pourriez sûrement le chercher dans n'importe quelle langue et le convertir vous-même.

ici est mon code pour faire rectangulaire -> polaire (façon dont l'autre est très facile) en C++

Vector3 C2P (const Vector3 &v) 
{ 
     float PI=3.14159260f; 
     Vector3 polar; 
     polar.x = v.Length(); 

     if (v.z > 0.0f) { 
       polar.y = (float) atan (v.z/sqrt (v.x * v.x + v.y * v.y)); 
     } 
     else if (v.z < 0.0f) { 
       polar.y = (float) -atan (sqrt (v.x * v.x + v.y * v.y)/v.z); 
     } 
     else { 

       polar.y = 0.0; 
     } 


     if (v.x > 0.0f) { 
       polar.z = (float) atan (v.y/v.x); 
     } 
     else if (v.x < 0.0f) { 
       polar.z = (float) atan (v.y/v.x) + PI; 
     } 
     else if (v.y > 0) { 
       polar.z = PI * 0.5f; 
     } 
    else { 
       polar.z = -PI * 0.5f; 
     } 
     //polar.z=(polar.z/M_PI)*180; 
     //polar.y=(polar.y/M_PI)*180; 
     return polar; 
} 

note le résultat est x = longueur, y = angle1 z = angle2, en radians.

EDIT: par mon code, je veux dire du code que j'ai volé quelque part et utilisé comme une fois.

+3

Mise en œuvre de Crappy. Vous devriez utiliser atan2 au lieu d'atan pour éviter les if-elses. – Tronic

1

Ce que vous demandez est une bibliothèque Map Projection. Une des bibliothèques open source les plus populaires est PROJ.4 et il y en a une Java Implementation.

Vous devez décider quelle projection vous voulez utiliser. Ils ont des propriétés différentes. Mercator est commun et est celui que Google Maps utilise. L'inconvénient avec Mercator est que vous ne pouvez pas l'utiliser autour des pôles arcitc.