Bon ça marche, mais j'ai 250 mètres d'écart je comprends pas pourquoi, j'ai juste remplacé la fonction Math.PI par la valeur la plus précise, mais ça a rien changé.
Après plusieurs tests, j'ai parfois 40 mètres d'écart et parfois 300 mètres... C'est bête.
A croire que les fonctions Arduino ne sont pas conçues de la même manière que celles en Javascript, mais quelles sont les plus précises ??!!
Essaie de comparer les valeurs à chaque étapes du calcul à quel moment il y a une différence, mais à bon avis ça vient de la précision des nombres flottants.
Essaie de comparer les valeurs à chaque étapes du calcul à quel moment il y a une différence, mais à bon avis ça vient de la précision des nombres flottants.
Déjà tous les résultats sont différents (comprend pas), à quelques millièmes près mais bon du coup à la fin ça fait n'importe quoi...
Puis j'ai lu dans la doc Arduino, qu'il s'arrêtait à la précision float, même si il propose de déclarer des variables double...
@Jean-François :
La première étape consiste à convertir nos degrés en radians. Ca c'est facile, il suffit de tout multiplier par 2?/360.
Eih ?
d = R * (Pi/2 - ArcSin( sin(destLat) * sin(sourceLat) + cos(destLong - sourceLong) * cos(destLat) * cos(sourceLat)))
Pi je peux peut être le remplacer en dur car il existe pas de fonction PI pour l'Arduino.
Unité de mesure des angles. Abréviation : rad.
Un angle plein vaut 2 PI rad ; un angle plat vaut PI rad ; un angle droit vaut PI/ 2 rad.
Pour convertir des degrés en radians : on multiplie par PI et on divise par 180 ;
pour convertir des radians en degrés : on multiplie par 180 et on divise par PI.
Pour des petites distances, une bonne approximation:
1 minute de latitude vaut 1852m (c'est le mille marin)
1 minute de longitude vaut 1852*cos(latitude)
Donc
D² = ((Lat2-Lat1) + ((Longi2-Longi1)*cos(Lat))²) * 1852
d = R * (Pi/2 - ArcSin( sin(destLat) * sin(sourceLat) + cos(destLong - sourceLong) * cos(destLat) * cos(sourceLat)))
Et exactement mêmes résultat qu'avec la toute première formule, pour des moyennes distances c'est pas trop mal, mais quand le JavaScript m'annonce 120 mètres (qui est juste), l'Arduino me donne 3.11 kms...
patsol:
Pour des petites distances, une bonne approximation:
1 minute de latitude vaut 1852m (c'est le mille marin)
1 minute de longitude vaut 1852*cos(latitude)
Donc
D² = ((Lat2-Lat1) + ((Longi2-Longi1)*cos(Lat))²) * 1852
Merci pour la proposition mais je n'arrive pas à reconstituer votre formule sur l'Arduino, le dernier Lat c'est le 1 ou le 2 ?
Celle ci de fonction (dessous), elle fonctionne bien SAUF que sur des distances d'environ moins de 6 kilomètres, elle renvoi n'importe quoi, elle va renvoyer 3 kilomètres pour 500 mètres, 4 kilomètres pour 200 mètres etc.