J'ai les informations suivantes:
Il existe une sphère d'origine (0,0,0) et de rayon R. Après avoir fait une intersection rayon-sphère, je connais un point (XYZ) dans l'espace 3D qui se trouve sur la sphère (la position exacte dans l'espace 3D où la ligne perce la coque sphérique).
Pour mon programme, je voudrais calculer la latitude et la longitude du point XYZ sur la sphère, mais je ne peux pas penser (ou Google) à un moyen de le faire facilement.
Donc, en bref, la fonction que j'essaie d'écrire est la suivante:
public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
return Latitude and Longitude
}
Est-ce que quelqu'un sait comment faire cela? Comme référence, ce fichier Wiki SVG peut être utile:
Mise à jour:
Merci pour toutes les réponses utiles, donc à la fin je suis allé avec ce code:
public static LatLon FromVector3(Vector3 position, float sphereRadius)
{
float lat = (float)Math.Acos(position.Y / sphereRadius); //theta
float lon = (float)Math.Atan(position.X / position.Z); //phi
return new LatLon(lat, lon);
}
Maintenant, je dois réfléchir à la réponse qui m'a le plus aidé à accepter: P.
Je suppose qu'il ne devrait pas être difficile de trouver les coordonnées polaires sphériques à partir de x, y, z (système de coordonnées 3D).
r
est toujours constant s'il est en surface.
(90 - θ) votre latitude (négative signifie que c'est en bas) comme il est mesuré à partir du haut .
φ est votre longitude. (mais pas tout à fait sûr du système de longitude)
Vérifiez également ce diagramme de wikipedia .
lat=atan2(z,sqrt(x*x+y*y))
lng=atan2(y,x)
L'utilisation de formules avec atan2()
est plus pratique. Vous n'avez pas à ajouter/soustraire pi/2 ou à vous soucier des problèmes de signe dans différents quadrants ou à diviser par zéro.
lat
sera> 0 dans l'hémisphère nordlat
sera <0 dans l'hémisphère sudlng
sera> 0 dans l'hémisphère orientallng
sera <0 dans l'hémisphère occidental
Cela a aidé à utiliser Javascript/THREE.js:
var lat = 90 - (Math.acos(y / RADIUS_SPHERE)) * 180 / Math.PI;
var lon = ((270 + (Math.atan2(x , z)) * 180 / Math.PI) % 360) -180;
Modifier - après avoir relu votre question, ma réponse n'est pas nécessairement applicable, mais je vais la laisser pour référence.
Cela dépend de la précision avec laquelle vous souhaitez être un objectif dans lequel vous allez utiliser le résultat. Il n'y a pas de système de latitude et de logitude unique, par exemple WGS84 (GPS USA) ou ETRS89 (GPS européen) diffèrent légèrement et divergent à mesure que l'océan Atlantique s'élargit.
Enfin, cela devrait répondre directement à votre question.
ou
http://www.ordnancesurvey.co.uk/oswebsite/gps/docs/convertingcoordinates3D.pdf