Misez P'tit, Optimisez - N°37 (Distance entre 2 points GPS)

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
currybleu
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 22
Enregistré le : 13 févr. 2013 15:43

Misez P'tit, Optimisez - N°37 (Distance entre 2 points GPS)

Message par currybleu »

Bonjour
Si vous le voulez-bien, un petit exercice sympa.. un peu la suite du MPO n°35 :lol:

- Google Earth donne les coordonnées du sommet du Mont-Blanc: Lat1: N4?.832891° Long1 E?.865074° (unités décimales)

- La formule pour calculer la distance entre 2 points est la suivante:

Code : Tout sélectionner

Distance=ACOS(SIN(RADIANS(lat1))*SIN(RADIANS(lat2))+COS(RADIANS(lat1))*COS(RADIANS(lat2))*COS(RADIANS(long1-long2)))*6371
Questions:
1 --> Retrouvez les valeurs des deux "?" pour la position GPS du sommet du mont Blanc
2 --> Saurez-vous faire un petit programme pour calculer la distance entre chez-vous (lat2/long2) et le mont-Blanc??
3 --> Question Subsidiaire: Quelle est la distance entre le Mont-Blanc et la tour-eiffel?

NB: Attention: il y a une petite subtilité à prendre en compte avec les unités d'angle

Source:
le site http://www.01net.com/editorial/555908/a ... -la-terre/

Pour moi, c'est 161Km :wink:
Modifié en dernier par currybleu le 15 févr. 2013 18:42, modifié 1 fois.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez P'tit, Optimisez - N°37 (Distance entre 2 points G

Message par Gilles59 »

Bonjour,

je n'y arrive pas avec cette formule ou quelque chose m'échappe !
J'ai trouvé celle ci qui semble mieux fonctionner pour moi (HP50en DEG)

-> Lat1 Long1 Lat2 Long2 '6378*(PI/2-ASIN(SIN(Lat2)*SIN(Lat1)+COS(Long2-Long1)*COS(Lat2)*COS(Lat1)))'

En particulier, je retrouve bien là l'ancienne définition du mètre comme la 10 millionnième partie du quart du méridien terrestre ( 0 0 90 0 )

Sur, entre autre la mesure du médirien (et donc du mètre) un lien très intéressant :
Ciel et espace - Arago

et

http://pyreneescatalanes.free.fr/Histoi ... ridien.php
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
currybleu
Fonctionne à 75 bauds
Fonctionne à 75 bauds
Messages : 22
Enregistré le : 13 févr. 2013 15:43

Re: Misez P'tit, Optimisez - N°37 (Distance entre 2 points G

Message par currybleu »

Petite astuce à propos des unités
Les COS et SIN doivent être fait en degrés alors que la fonction ACOS doit être utilisée en Radians :D
(Mettre en mode radian avant de calculer ACOS)
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3422
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°37 (Distance entre 2 points G

Message par C.Ret »

Et, oui, c'est toute la subtilité de cette formule.

Les cosinus doivent calculer en dégrés car c'est dans cette unité que l'on exprime traditionellement les coordonnées géographiques.
Par contre, le produit du rayon de la terre (ici arrondi à 6378 km) par l'arc cosinus doit être effectué en radian, car il s'agit ici de calculer le résultat d'une intégration.

D'où ma proposition :

Code : Tout sélectionner

« -> a1 o1 a2 o2 
    '6378*D->R(ACOS(COS(a2)*COS(a1)*COS(o2-o1)+SIN(a2)*SIN(a1)))' »
à utiliser bien évidemment en mode DEG.

L'implémentation homologue (à utiliser en mode RADIAN) est plus longue, car il faut convertir les degrés en radian dans chaque COS et SIN.

Mais, le soucis n'est pas là.
Il y a, pour les coordonnées géographiques de type GPS, trois façon de représenter la latitude et la longitute:
- en degrés décimaux ddd.dddddd° ( par exemple Mont Blanc N 45.83289° E 6.86507° )
- en degrés et minutes décimales, ddd°mm.mmm' (par exemple Mont Blanc N45° 49.973' E 006° 51.904' )
- en degrés, minutes et secondes, ddd°mm'ss.ssss" (par exemple Mont Blanc N 45° 49' 58.4" E6° 51' 54.3" )

La fonction ci-dessus ne fonctionne que en saisissant les coordonnées géographiques en degré décimaux !

Cette formule considère que la Terre est parfaitement sphèrique. La distance ainsi calculée sera donc d'autant plus fausse que l'on est proche des pôles.
Autre source d'erreur provient du fait que les coodonnées GPS sont celles du système géodésique WGS 84 qui modèlise la Terre en prenant un élypsoïde de réfèrence légèrement applatit et donc un rayon qui évolue en fonction de la lattitude.
Mais, en France, comme nous sommes au alentours du 45° parallèle, cette formule peut donner de bons résultats si l'on ne cherche pas une précision de moins d'un kilomètre.

Voici un programe pour SHARP PC-1211 qui accepte les coodonnées sous les trois formats. Si l'on dispose des coodonnée en degrés déciaux (ddd.ddddd°), on saisi uniquement les valeurs DEG (on tapant directement ENTER lorsque le PC-1211 demande MIN et SEC). Si l'on dispose des coordonnées en degré-minute ou ne renseigne que les champ de saisie DEG et MIN (ou tape ENTER sans rien entrer lorsuqe le pocket demande les SEC).

Code : Tout sélectionner

10 CLEAR :DEGREE :M=60,N=MM
15 PAUSE "POINT A:"
20 INPUT "A:LAT  -1=S +1=N  ";R
25 IF ABS U<>1 THEN 20
30 INPUT "A:LAT  DEG "; A ,"A:lat  MIN "; B ,"A:LAT  SEC "; C
35 INPUT "A: -1=W +1=E  ";S
40 IF ABS S<>1 THEN 35
45 INPUT "A:LONG DEG "; D ,"A:LONG MIN "; E ,"A:LONG SEC "; F
50 PAUSE "POINT B:"
55 INPUT "B:LAT -1=S +1=N  ";T
60 IF ABS T<>1 THEN 55
65 INPUT "B:LAT  DEG "; G ,"B:LAT  MIN "; H ,"B:LAT  SEC "; I
70 INPUT "B:LONG -1=W +1=E  ";U
75 IF ABS U<>1 THEN 70
80 INPUT "B:LONG DEG "; J ,"B:LONG MIN "; K ,"A:LONG SEC "; L
85 A=(MA+NB+C)/MR, D=(MD+NE+F)/MS, G=(MG+NH+I)/MT, J=(MJ+NK+L)/MU
90 P=COS A*COS G*COS (D-J)+SIN A*SIN G:RADIAN :PRINT 6371*ACS P,"KM"
95 GOTO 15
Modifié en dernier par C.Ret le 16 févr. 2013 16:28, modifié 1 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
dprtl
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 463
Enregistré le : 27 janv. 2013 00:26
Localisation : Strasbourg
Contact :

Re: Misez P'tit, Optimisez - N°37 (Distance entre 2 points G

Message par dprtl »

Voici mon programme pour Casio PB-1000. Il reprend exactement la formule initiale, en degrés pour la première partie du calcul, et en radians pour la fin :

Code : Tout sélectionner

10 ANGLE0:A=SIN(lat1)*SIN(lat2)+COS(lat1)*COS(lat2)*COS(long1-long2)
20 ANGLE1:PRINT ACS(A)*6366
Une méthode classique avec une Casio pour entrer les données (variables toujours globales), est de procéder en mode CAL, par exemple :

lat1=48.872555
long1=2.399054
lat2=-54.814511
long2=-68.307753

Il ne reste plus qu'à lancer le programme (plusieurs fois si on doit ajuster des choses, mais sans retaper les données). Le résultat :

13262.5684

Il est identique au résultat donné dans la copie d'écran tableur de 01net, avec la multiplication par 6366, et non par 6371. Donc peut-être avec un rayon de la terre plus près des pôles ? (la terre est légèrement applatie)

Image
Modifié en dernier par dprtl le 17 févr. 2013 23:19, modifié 1 fois.
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: Misez P'tit, Optimisez - N°37 (Distance entre 2 points G

Message par Gilles59 »

En 70 octets tout rond et aucun registre

Code : Tout sélectionner

« DEG ROT - COS UNROT DUP2 SIN SWAP SIN *  UNROT COS SWAP COS * ROT * + RAD ACOS 6371 * »
'Dst' STO
je suis à 595 km du Mont Blanc et le mètre mesure Dst(0,0,90,0) -> 1.0007543398 m ;)

Usage
Lat1 Long1 Lat2 Long 2 Dst
ou
Dst(Lat1,Long1,Lat2,Long2)

EDIT : Un truc auquel je n'avais jamais fait attention sur Casio 602P c'est qu'il est impossible de changer de mode angulaire dans un programme ( car taper MODE 4 pour passer ne degré fait sortie du MODE 2 (programmation)). Probablement c'est pareil sur 702P ?
Modifié en dernier par Gilles59 le 16 févr. 2013 22:27, modifié 1 fois.
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3422
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°37 (Distance entre 2 points G

Message par C.Ret »

dprtl a écrit :[...]Il est identique au résultat donné dans la copie d'écran tableur de 01net, avec la multiplication par 6366, et non par 6371. Donc peut-être avec un rayon de la terre plus près des pôles ? (la terre est légèrement applatie)
C'est tout à fait possible, le système de coorodnnée GPS (donc celui de Google Earth) définit la terre comme une sphère très lègèrement applatie qui est donc définie par deux rayons respectivemetn a et b.

Par définition (WGS 84):
* demi grand axe a = 6378.137 km
* aplatissement f = 1/298,257223563 avec f = (b-a)/a

Par calcul (WGS84):
* demi petit axe b = 6356.752 km
* circonférence équatoriale 2·π·a = 40075.017 km (2·π·b = 39940.652 km)

Une méthode pour calculer de telle distance est de corriger le rayon de la Terre en fonction des lattitudes entre les deux points. Mais cela nécesite une intégration. Une approximation est d'approximé par un rayon moyen calculé , par exemple, entre les deux points.
r =a + (b-a)*sin lat_m = a ( 1 + f*sin lat_m )
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3644
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez P'tit, Optimisez - N°37 (Distance entre 2 points G

Message par Hobiecat »

Une petite version sans prétention sur HP-41 :

Code : Tout sélectionner

LBL GPS
x<>y
RDN
-
COS
RUP
COS
*
x<>y
ENTER
COS
x<>y
RDN
*
RDN
SIN
x<>y
SIN
*
RUP
+
RAD
ACOS
6371
*
DEG
RTN
Ça doit pouvoir s'optimiser... :wink:
Avatar du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3422
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Misez P'tit, Optimisez - N°37 (Distance entre 2 points G

Message par C.Ret »

Pas mal, ça s'optimise pas tant que cela :

Code : Tout sélectionner

                t:              z:                 y:                         x:     :L
001 LBL GPS     a1              o1                 a2                         o2
002 ST- Z       a1           o1-o2                 a2                         o2
003 RDN                         a1              o1-o2                         a2
004 COS                         a1              o1-o2                    cos(a2)     a2
005 LASTX       a1           o1-o2            cos(a2)                         a2       
006 SIN         a1           o1-o2            cos(a2)                    sin(a2)
007 RUP      o1-o2         cos(a2)            sin(a2)                         a1
008 SIN      o1-o2         cos(a2)            sin(a2)                    sin(a1)     a1
009 ST* Y    o1-o2         cos(a2)    sin(a2)*sin(a1)                    sin(a1)  
010 X<> L    o1-o2         cos(a2)    sin(a2)*sin(a1)                         a1     sin(a1)
011 COS      o1-o2         cos(a2)    sin(a2)*sin(a1)                    cos(a1) 
012 RUP    cos(a2) sin(a2)*sin(a1)            cos(a1)                     o1-o2
013 COS    cos(a2) sin(a2)*sin(a1)            cos(a1)                 cos(o1-o2)     o1-o1
014 *      cos(a2)         cos(a2)    sin(a2)*sin(a1)         cos(a1)*cos(o1-o2)     cos(o1-o2)
015 RUP            sin(a2)*sin(a1) cos(a1)*cos(o1-o2)                    cos(a2)
016 *                                 sin(a2)*sin(a1) cos(a1)*cos(o1-o2)*cos(a2)     cos(a2)
017 +                                 sin(a2)*sin(a1)+cos(a1)*cos(o1-o2)*cos(a2)     co...
018 ACOS                                                                   ARC°
019 D-R                                                                  ARC_rd
020 6371                                      ARC_rd                       6371
021 *                                                                  6371*ARC
022 RTN                                                                      km

a1, o1, a2 et o2 sont respectivement les latitudes et longitudes des deux points exprimés en degré décimaux ddd.ddddd° (en valeur positives pour les latitudes nord et longitudes est et en valeur négatives pour les latitudes de l'hémisphère sud et longitude à l'ouest du méridien de Greenwich).

L'HP-41 doit être laissée en mode degré.
Les quatre coordonnées sont saisies dans l'ordre a1 o1 a2 et o2 avant de lancer le programme qui retourne la distance approximée en kilomètres.
Modifié en dernier par C.Ret le 26 févr. 2013 18:14, modifié 1 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3644
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Misez P'tit, Optimisez - N°37 (Distance entre 2 points G

Message par Hobiecat »

Bien vu ! En fait j'ai fait mon programme sur 41 dans l'idée de le porter sur des machines plus anciennes genre 34C ou 29C, c'est pourquoi je me suis "interdit" l'utilisation des accès directs à la pile. Mais effectivement, ça ne fait pas gagner tant que ça...
Répondre

Retourner vers « Tous les Pockets »