IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Pascal Discussion :

Calcul d'une distance entre deux points à partir d'une version simplifiée des coordonnées GPS


Sujet :

Pascal

  1. #21
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 419
    Points : 5 818
    Points
    5 818
    Par défaut
    Salut

    Ta fonction Saisie est incompréhensible, ta boucle while ferme le fichier entrée à la première boucle, tu as des blocs qui ne servent à rien...

    Voilà comment je vois ta fonction globalement ... je ne l'ai pas testée mais je pense qu'elle te donne une bonne idée de la façon de procéder :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    Procedure Saisie (var coord1, coord2 : Coordonnees);
    var 
      entree, sortie1,sortie2 : text;
      strlatitude, strlongitude, strville: String;
    var 
      pa,pd : string;
    begin
      writeln ('Point de depart');
      readln(pd);
      writeln ('Point arrivee');
      readln(pa);
      assign(entree,'destination.txt');
      reset(entree);
      while not(eof(entree)) do
      begin
        readln(entree, strlatitude);
        readln(entree, strlongitude); 
        readln(entree, strville);
       // begin
        if ville = pa then  // Test ville de depart
        begin 
          assign(sortie1,'depart.txt');
          rewrite(sortie1);
    	  writeln (sortie1, strlatitude); 
          writeln (sortie1, strlongitude);
          close(sortie1);
    	end; 
        if ville = pd then // Test ville d'arrivé
        begin
          assign (sortie2, 'arrivee.txt');
          rewrite(sortie2);  // on ouvre le fichier en ecriture
          writeln(sortie2, strlatitude); // on ecrit dans le fichier
          writeln (sortie2, strlongitude); // on ecrit dans le fichier
          close(sortie2);
        end;
      end; // Fin du while  	
      ////////////////////////////////
      close (entree);
      // On Verifie ce qui a ete ecrit et on le passe en paramettre
      assign(sortie1,'depart.txt');
      reset(sortie1);
      readln(sortie1,StrValeurLongitude);
      writeln (StrValeurLongitude); // Les coordonees en texte ? 
      readln(sortie1,StrValeurlatitude);
      writeln (StrValeurlatitude);
      coord1.longitude := StrToFloat(StrValeurLongitude);
      coord1.latitude:= StrToFloat(StrValeurlatitude);
      close(sortie1);
     
      assign(sortie2,'arrivee.txt');
      reset(sortie2);
      readln(sortie2,StrValeurLongitude); // Les coordonees en texte ? 
      writeln (StrValeurLongitude);
      readln (sortie2,StrValeurlatitude);
      writeln (StrValeurlatitude);
      coord2.longitude := StrToFloat(StrValeurLongitude);
      coord2.latitude:= StrToFloat(StrValeurlatitude);
      close (sortie2);
    end;
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  2. #22
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour,
    merci pour la proposition ^^
    Par contre quand je l'execute ça me met ce message d'erreur : Nom : 2018-10-30 (1).png
Affichages : 534
Taille : 74,2 Ko
    merci d'avance

  3. #23
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Salut, c'est a cause de ton test

    if ville = pa then // Test ville de departqui devrait être if strville = pa then // Test ville de departvu qu'il ne trouve pas la ville les coordonnées sont vide d'ou ton erreur

    Rajoutes au début de la procédure
    strLatitude := '0.0'; strLongitude := '0.0';Tu peux également rajouter un test pour savoir si ta ville est présente

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    Var
    Found : Boolean;
    Found := False;
    while not(eof(entree)) or (not(Found)) do
      begin
        readln(entree, strlatitude);
        readln(entree, strlongitude); 
        readln(entree, strville);
       // begin
        if ville = pa then  // Test ville de depart
        begin 
          Found := True
          assign(sortie1,'depart.txt');
          rewrite(sortie1);
          writeln (sortie1, strlatitude); 
          writeln (sortie1, strlongitude);
          close(sortie1);
       end; 
      if not(Found) then
      begin
        Writeln('Ville non trouvée.');
        Exit;
      end;
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  4. #24
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    merci pour la solution mais maintenant voila ce que j'obtiens et je ne peux rien écrire en dessous
    Nom : 2018-10-30 (3).png
Affichages : 439
Taille : 251,0 Ko

    Voilà le code avec toutes les modifications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    Program Calcul;
     
    uses math, unite,sysutils ; 
     
     
     
    Procedure Saisie (var coord1, coord2 : Coordonnees);
    var 
      entree, sortie1,sortie2 : text;
      strlatitude, strlongitude, strville: String;
    var 
      pa,pd : string;
      Var Found : Boolean;
     begin 
    Found := False;
    begin
      writeln ('Point de depart');
      readln(pd);
      writeln ('Point arrivee');
      readln(pa);
      assign(entree,'destination.txt');
      reset(entree);
      while not(eof(entree)) or (not(Found)) do
     
        readln(entree, strlatitude);
        readln(entree, strlongitude); 
        readln(entree, strville);
       // begin
        if strville = pa then  // Test ville de depart
        begin 
          Found := True;
          assign(sortie1,'depart.txt');
          rewrite(sortie1);
          writeln (sortie1, strlatitude); 
          writeln (sortie1, strlongitude);
          close(sortie1);
       end; 
      if not(Found) then
      begin
        Writeln('Ville non trouvée.');
        Exit;
      end;
     
     
        if strville = pd then // Test ville d'arrivé
        begin
          assign (sortie2, 'arrivee.txt');
          rewrite(sortie2);  // on ouvre le fichier en ecriture
          writeln(sortie2, strlatitude); // on ecrit dans le fichier
          writeln (sortie2, strlongitude); // on ecrit dans le fichier
          close(sortie2);
        end;
         if not(Found) then
      begin
        Writeln('Ville non trouvée.');
        Exit;
      end;
     
      end; // Fin du while  	
      ////////////////////////////////
      close (entree);
      // On Verifie ce qui a ete ecrit et on le passe en paramettre
      assign(sortie1,'depart.txt');
      reset(sortie1);
      readln(sortie1,StrLongitude);
      writeln (StrLongitude); // Les coordonees en texte ? 
      readln(sortie1,Strlatitude);
      writeln (Strlatitude);
      coord1.longitude := StrToFloat(StrLongitude);
      coord1.latitude:= StrToFloat(Strlatitude);
      close(sortie1);
     
      assign(sortie2,'arrivee.txt');
      reset(sortie2);
      readln(sortie2,StrLongitude); // Les coordonees en texte ? 
      writeln (StrLongitude);
      readln (sortie2,Strlatitude);
      writeln (Strlatitude);
      coord2.longitude := StrToFloat(StrLongitude);
      coord2.latitude:= StrToFloat(Strlatitude);
      close (sortie2);
    end;
     
     
    Function Calculcurviligne (coord1,coord2: Coordonnees) : Real;
    var   S, delta, distance: Real;
     
    Begin
    delta := (Coord2.Longitude-Coord1.Longitude);
    S := arccos (sin(Coord1.latitude)*sin(Coord2.latitude) + cos(Coord1.latitude)*cos(Coord2.latitude)*cos(delta) );
    distance := 6378*S;
        Calculcurviligne := distance;
     
    end;
     
     
     
    Procedure Affichage (coord1, coord2 : Coordonnees; var distance : Real);
     
    Begin
    distance:=Calculcurviligne(coord1,coord2);
      writeln ('Distance a parcourir ', distance);
     
    end;
     
     
    var distance : Real;
    var coord1, coord2 : Coordonnees;
    begin
    Saisie (coord1, coord2);
    Affichage(coord1, coord2, distance);
    end.
    merci encore désolé je suis vraiment nul en informatique
    Images attachées Images attachées  

  5. #25
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Bonsoir, il faut que tu sois plus minutieux, c'est bourré d'erreurs basiques

    Je te conseille d'aller faire un tour du coté des tutoriels sur le Pascal.

    Tu devrais reprendre ton code point par point.

    Voilà un code "From Scratch" et j'en ai profité pour corriger ta formule de calcul de la distance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    Program CalculDistance;
     
    uses
      math, sysutils;
     
    Type
      TCoordonnee = record
        Latitude : Double;
        Longitude : Double;
      end;
     
    function ChargeCoordsVille(aNomville : String; var aCoord : TCoordonnee) : Boolean;
    var
      lFic : Text;
      lFound : Boolean;
      lStrLatitude, lStrLongitude, lStrVille: String;
    begin
      lFound := False;
      assign(lFic,'Villes.txt');
      reset(lFic);
      While not(eof(lFic)) and not(lFound) do
      begin
         readln(lFic, lStrville);
         readln(lFic, lStrLatitude);
         readln(lFic, lStrLongitude);
         if (UpperCase(lStrVille) = UpperCase(aNomVille)) then lFound:=True;
      end;
     
      if lFound then
      begin
        aCoord.Latitude := StrToFloat(lStrLatitude);
        aCoord.Longitude := StrToFloat(lStrLongitude);
      end;
     
      Result := lFound;
      Close(lFic);
    end;
     
    function Saisie(var CoordDepart, CoordArrivee : TCoordonnee): Boolean;
    Var
      VilleDepart, VilleArrivee : String;
    begin
       Result := False;
       write ('Point de depart : ');
       ReadLn(VilleDepart);
       if not(ChargeCoordsVille(VilleDepart, CoordDepart)) then
       begin
         WriteLn('Ville de départ non trouvée !!!');
         Exit;
      end;
       write ('Point d''arrivé : ');
       ReadLn(VilleArrivee);
       if not(ChargeCoordsVille(VilleArrivee, CoordArrivee)) then
       begin
         WriteLn('Ville d''arrivée non trouvée !!!');
         Exit;
      end;
      Result := True;
    end;
     
    Function Calculcurviligne (aCoord1,aCoord2: TCoordonnee) : Double;
    Begin
     
     (*  Latitudes et longitudes en radians de deux coordonnées.
     
      Distance en Km= ACOS( SIN(lat1) * SIN(lat2) +
                            COS(lat1) * COS(lat2) * COS(lon2-lon1) )*6371
     
      Orientation = ATAN2(COS(lat1)*SIN(lat2)-SIN(lat1)*COS(lat2)*COS(lon2-lon1); SIN(lon2-lon1)*COS(lat2))
     
      en radians (+/-) par rapport au nord.
     
     
     
      Destination étant donné point 1 et l'orientation vesr point 2.
     
      lat2: =ASIN(SIN(lat1)*COS(d/R) + COS(lat1)*SIN(d/R)*COS(Orient))
      lon2: =lon1 + ATAN2(COS(d/R)-SIN(lat1)*SIN(lat2); SIN(Orient)*SIN(d/R)*COS(lat1))
     
      R = 6371 Km, d = distance en Km, Orient = Orientation en radians. *)
     
      Result:= arccos ( sin(DegToRad(aCoord1.Latitude)) * sin(DegToRad(aCoord2.Latitude)) +
                        cos(DegToRad(aCoord1.Latitude)) * cos(DegToRad(aCoord2.Latitude)) * cos(DegToRad(aCoord2.Longitude - aCoord1.Longitude))) * 6371 ;
     
    end;
     
    Var
      Coord1, Coord2 : TCoordonnee;
      Distance : Double;
    Begin
      if Saisie(Coord1, Coord2) then
      begin
        Distance := Calculcurviligne(Coord1, Coord2);
        WriteLn;
        WriteLn('Distance à parcourir : '+ FloatToStr(Distance) + ' Km');
        ReadLn;
      end;
    End.
    ---> fichier Villes.txt :

    Lyon
    4.835948
    45.761187
    Marseille
    5.359944
    43.293368
    Paris
    2.346514
    48.853869
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  6. #26
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Septembre 2018
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2018
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Bonjour,
    Merci beaucoup !
    Par contre je l'ai testé avec votre fichier ville et à chaque fois ça me mets ville de départ non trouvé et je n'arrive pas à voir d'où vient le problème ...
    Merci encore

  7. #27
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Orelindel Voir le message
    Bonjour,
    Merci beaucoup !
    Par contre je l'ai testé avec

    votre fichier ville et à chaque fois ça me mets ville de départ non trouvé et je n'arrive pas à voir d'où vient le problème ...
    Merci encore
    Attention cela ne gère pas les fautes d'orthographe

    DistanceVille.zip
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  8. #28
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Octobre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Point de depart : Lyon
    Ville de d├®part non trouv├®e !!!

    Distance Ã* parcourir : 0 Km
    je ne crois pas avoir fait de faute d'orthographe

  9. #29
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Comment compiles tu le projet que j'ai mis dans le zip ? Villes.Txt est-il bien dans le même dossier que l'exécutable ?

    Nom : 2018-10-31_140550.jpg
Affichages : 347
Taille : 15,6 Ko
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  10. #30
    Candidat au Club
    Femme Profil pro
    etudiant
    Inscrit en
    Octobre 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Octobre 2018
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Voila ce que j'obtiens maintenant sachant que j'ai dû déclarer result ...
    Point de depart : Paris
    An unhandled exception occurred at $0040EF3D:
    EConvertError: "2.346514" is an invalid float
    $0040EF3D
    $0040EF0E
    $00401809
    $00401A28

    Est ce que ça joue que j'utilise Geany et FreePascal ?

  11. #31
    Expert confirmé
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Points : 4 346
    Points
    4 346
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Maudr Voir le message
    Voila ce que j'obtiens maintenant sachant que j'ai dû déclarer result ...
    Point de depart : Paris
    An unhandled exception occurred at $0040EF3D:
    EConvertError: "2.346514" is an invalid float
    $0040EF3D
    $0040EF0E
    $00401809
    $00401A28

    Est ce que ça joue que j'utilise Geany et FreePascal ?
    Bonjour,

    Ici l'erreur semble venir du fait que ton systeme utilise la virgule comme séparateur de décimal

    Essayes de rajouter

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    Type
      TCoordonnee = record
        Latitude : Double;
        Longitude : Double;
      end;
     
    var
      formats: TFormatSettings; // A ajouté ici
    ....
     
    Var
      Coord1, Coord2 : TCoordonnee;
      Distance : Double;  
     
    Begin
      formats := DefaultFormatSettings;
      formats.DecimalSeparator := '.';
    et changes les FloatToStr(XXXX) par FloatToStr(XXXX, Formats)
    PS: J'ai testé avec Geany sous windows et je n'ai pas rencontré de problèmes
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  12. #32
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Calcul d'une distance entre 2 points à partir d'une version simplifiée des coordonnées GPS
    Bonjour,

    Je ne comprends rien au calcul de la longueur de l'arc (M1M2) ... mais peut-être l'heure est-elle encore trop matinale ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    (*  Latitudes et longitudes en radians de deux coordonnées.
     
      Distance en Km= ACOS( SIN(lat1) * SIN(lat2) +
                            COS(lat1) * COS(lat2) * COS(lon2-lon1) )*6371
      Orientation = ATAN2(COS(lat1)*SIN(lat2)-SIN(lat1)*COS(lat2)*COS(lon2-lon1); SIN(lon2-lon1)*COS(lat2))
     
      en radians (+/-) par rapport au nord.
      Destination étant donné point 1 et l'orientation vesr point 2.
     
      lat2: =ASIN(SIN(lat1)*COS(d/R) + COS(lat1)*SIN(d/R)*COS(Orient))
      lon2: =lon1 + ATAN2(COS(d/R)-SIN(lat1)*SIN(lat2); SIN(Orient)*SIN(d/R)*COS(lat1))
     
      R = 6371 Km, d = distance en Km, Orient = Orientation en radians. *)
     
    Function Calculcurviligne (aCoord1,aCoord2: TCoordonnee) : Double;
    Begin
      Result:= arccos ( sin(DegToRad(aCoord1.Latitude)) * sin(DegToRad(aCoord2.Latitude)) +
                        cos(DegToRad(aCoord1.Latitude)) * cos(DegToRad(aCoord2.Latitude)) * cos(DegToRad(aCoord2.Longitude - aCoord1.Longitude))) * 6371 ;
    end;
    Dans un repère terrestre orthonormé dans lequel (z'z) représente l'axe des pôles, et (xOy) le plan équatorial, les deux villes admettent pour coordonnées cartésiennes (de tête, donc à vérifier):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X1 = R*Cos(Lat1r)*Cos(Lon1r)  ;  X2 = R*Cos(Lat2r)*Cos(Lon2r)
    Y1 = R*Cos(Lat1r)*Sin(Lon1r)  ;  Y2 = R*Cos(Lat2r)*Sin(Lon2r)
    Z1 = R*Sin(Lat1r)             ;  Z2 = R*Sin(Lat2r)
    étant bien entendu que les angles en cause sont exprimés en radians et résultent d'une conversion par la fonction DegToRad(.) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Lat1r:= DegToRad(Acoord1.Latitude);
    Lon1r:= DegToRad(Acoord1.Longitude);
    ...
    L'angle (u) sous lequel on voit l'arc de cercle (M1M2) depuis le centre (O) intervient dans l'expression du produit scalaire des deux vecteurs position:
    Ps = (OM1OM2) = R2 * Cos(u) = X1*X2 + Y1*Y2 + Z1*Z2
    ainsi que celle de la longueur de l'arc:
    L(M1M2) = R * ArcCos(Ps / R2) ;
    il vient par conséquent:
    L(M1M2) = R * ArcCos(U1*U2 + V1*V2 + W1*W2)
    si l'on a recours aux coordonnées "réduites": Ui = Xi : R , Vi = Yi / R , Wi = Zi / R .

    Cela ne ressemble guère au résultat livré sous forme de train de marchandise ...

    # J'ajoute que le procédé consistant à bourrer au maximum l'expression du résultat par emboîtement des fonctions est en soi scandaleux, comparable à une plaisanterie bien grasse lâchée en pleine réunion familiale, pour l'anniversaire de la grand'mère: il est illisible, les grandeurs intermédiaires invérifiables, et c'est le meilleur moyen de se gourer dans l'écriture du code ... mission apparemment réussie
    Un codage concis, mais contrôlable à chaque étape du calcul, pourrait par exemple être écrit sous la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    TYPE Ve3D = RECORD  u, v, w: Reel  END;
     
    FUNCTION Pscal(Va, Vb: Ve3D): Reel;
      VAR p, q, r, s: Reel;
      BEGIN
        p:= Va.u * Vb.u; q:= Va.v * Vb.v;
        r:= Va.w * Vb.w; s:= p + q; Pscal:= r + s
      END;
     
    FUNCTION Longueur_Arc(Point1, Point2: TCoordonnee): Reel;
      CONST R = 6371;
      VAR Angle, Clat, Clon, Slon, LatR, LonR: Reel; V1, V2: Ve3D;
      BEGIN
        LatR:= DegToRad(Point1.Latitude); LonR:= DegToRad(Point1.Longitude);
        Clat:= Cos(Point1.Latitude);      Clon:= Cos(Point1.longitude);
        Slon:= Sin(Point1.Longitude);     V1.u:= Clat * Clon;
        V1.v:= Clat * Slon;               V1.w:= Sin(Point1.Latitude);
     
    //    ... / ... // Devinez la suite
     
        Angle:= ArcCos(Pscal(V1, V2));    Longueur_Arc:= R * Angle
      END;
    Vous corrigerez les erreurs qui pourraient subsister dans ce moignon de code non compilé.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  13. #33
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Il ne faut pas confondre vitesse et précipitation
    Il y a deux manières de répondre à la question posée:

    a) une approche géométrique, partant de l'expression des vecteurs positions (OM1, OM2) des lieux considérés: c'est la voie la plus naturelle conduisant au calcul de la longueur de l'arc, et qui a été présentée au message (#32);
    b) un prolongement analytique, qui isole dans le développement complet du produit scalaire
    Ps = (OM1OM2)
    l'expression littérale de Cos(Long1 - Long2), et conduit à un allègement des calculs.

    Par ailleurs, le recours à la procédure SinCos(., ., .) permet un calcul plus rapide des fonctions trigonométriques.

    D'où pour comparaison deux sous-programmes livrant la valeur cherchée, et partant de déclarations communes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     CONST Kdr = Pi / 180; Max = 10000000;
     
     TYPE PcoordG = RECORD  Lat, Lon: Reel  END;
          Ve3D = RECORD  u, v, w: Reel  END;
     
     CONST P1: PcoordG = (Lat:30; Lon: 0);
           P2: PcoordG = (Lat:55; Lon: 50);
           C1 = 2; C2 = C1 + 40; L1 = 8;
     
     VAR Point1, Point2: PcoordG;
         Dist1, Dist2, Dist3: Reel;
         k: Z_32; T1, T2, T3: Reel;
    a) première fonction envisagée, version améliorée de ce qui a été proposé auparavant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     FUNCTION Pscal(Va, Vb: Ve3D): Reel;
       VAR p, q, r, s: Reel;
       BEGIN
         p:= Va.u * Vb.u; q:= Va.v * Vb.v;
         r:= Va.w * Vb.w; s:= p + q; Result:= r + s
       END;
     
     FUNCTION VectUn(Point: PcoordG ): Ve3D;
       VAR Clat, Clon, Slon: Reel; V_: Ve3D;
       BEGIN
         SinCos(Kdr * Point.Lat, V_.w, Clat);
         SinCos(Kdr * Point.Lon, Slon, Clon);
         V_.u:= Clat * Clon;
         V_.v:= Clat * Slon; Result:= V_
       END;
     
     FUNCTION Longueur_Arc1: Reel;
       CONST Rt = 6371;
       VAR Theta: Reel;
       BEGIN
         Theta:= ArcCos(Pscal(VectUn(Point1), VectUn(Point2)));
         Result:= Rt * Theta
       END;
    b) seconde fonction, répondant à ce que l'on trouve généralement sur la Toile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     FUNCTION Longueur_Arc2(P_1, P_2: PcoordG): Reel;
       CONST Rt = 6371;
       VAR Cl12, Clat1, Clat2, p, q, r, Slat1, Slat2, Theta: Reel;
       BEGIN
         SinCos(Kdr * P_1.Lat, Slat1, Clat1);
         SinCos(Kdr * P_2.Lat, Slat2, Clat2);
         r:= P_1.Lon - P_2.Lon; Cl12:= Cos(Kdr * r);
         p:= Slat1 * Slat2;
         q:= Clat1 * Clat2;     r:= q * Cl12;
         Theta:= ArcCos(p + r); Result:= Rt * Theta
       END;
    c) et en plus la séquence compacte d'instructions, directement transcrite de l'expression mathématique de la longueur de l'arc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     FUNCTION Calculcurviligne(P_1, P_2: PcoordG): Reel;
       BEGIN
         Result:= ArcCos(Sin(DegToRad(P_1.Lat)) * Sin(DegToRad(P_2.Lat)) +
                         Cos(DegToRad(P_1.Lat)) * Cos(DegToRad(P_2.Lat)) *
                         Cos(DegToRad(P_2.Lon - P_1.Lon))) * 6371
       END;
    J'ai repéré dans chacun des cas et pour les mêmes positions (M1, M2) aléatoirement déterminées la durée d'exécution de dix millions de calculs: les valeurs obtenues varient peu, et restent toujours dans le même ordre: T1 > T3 > T2 .

    Nom : Clipboard02.png
Affichages : 294
Taille : 3,5 Ko

    Le second algorithme est toujours le plus efficace: le temps d'exécution du troisième dépasse généralement le précédent de 25 à 30 %.

    Comme quoi concision et rapidité ne vont pas forcément de pair ... Alors autant s'en tenir à un algorithme lisible et correctement écrit - ce qui est bien le moins que l'on puisse attendre d'un programme source ...


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  14. #34
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Il ne faut pas confondre vitesse et précipitation (suite)
    J'ai oublié quelques précisions dans le dernier message (#38):

    # la fonction vectorielle VectUn(Point: PcoordG ): Ve3D retourne les composantes du vecteur unitaire associé à la position des points considérés en fonction de leurs coordonnées géographiques:
    u = (1/OMi).OMi .
    Ses composantes
    u = Cos(Lat)*Cos(Lon) ,
    v = Cos(Lat)*Sin(Lon) ,
    w = Sin(Lat) ,
    sont les cosinus directeurs du rayon (OM);

    # Les durées d'exécution des 107 calculs sont exprimées en secondes - ce qui correspond pour chacun d'eux à un temps moyen remarquablement court, compte tenu de leur complexité (0.3 à 0.6 µs).


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  15. #35
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    J'ai oublié quelques précisions dans le dernier message (#38):
    Bref, l'ensemble de votre intervention, en plus d'être extrêmement désagréable, est pratiquement inutile puisqu'on ne sait pas ce qu'on doit en retenir. C'est dommage !
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  16. #36
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Au final, pour le peu que j'ai supporté de lire : le code initial fournit un résultat juste en collant à une formule mathématique et dans un temps raisonnable.

    Pour le reste de ce qui a été débattu, chacun peut rester sur des avis arbitraires (je n'aime pas cette façon de programmer, par exemple), du moment que la courtoisie n'en souffre pas et que la critique est constructive.
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  17. #37
    Responsable Lazarus & Pascal

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    Février 2013
    Messages
    1 436
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2013
    Messages : 1 436
    Points : 20 855
    Points
    20 855
    Billets dans le blog
    84
    Par défaut
    Bonjour à tous,

    Je me suis permis de supprimer les messages qui n'apportaient rien à la discussion.

    Je vous rappelle que les échanges doivent rester courtois : des mots comme "débile" par exemple n'ont rien à faire dans les discussions, pas plus que les remarques désobligeantes sur l'orthographe. Nous sommes là pour aider et corriger les erreurs les plus flagrantes, éventuellement pour alerter en privé, certainement pas pour se moquer.
    Bien que la charte des membres du club ait été bafouée plusieurs fois, aucune sanction n'a été prise, mais j'espère que chacun retrouvera ses esprits !

    Cordialement,

    Gilles
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

Discussions similaires

  1. Calcul de la distance entre deux points
    Par ines ben alaya dans le forum MATLAB
    Réponses: 0
    Dernier message: 17/10/2017, 21h15
  2. Réponses: 3
    Dernier message: 26/09/2015, 13h22
  3. Calcul distance entre un point et une poly3D
    Par LoicL89 dans le forum Lisp
    Réponses: 2
    Dernier message: 15/07/2015, 19h54
  4. Calcul de la distance entre 2 points géographiques
    Par nico_83220 dans le forum Scilab
    Réponses: 6
    Dernier message: 28/11/2014, 20h35
  5. Calcul de distance entre deux points sur une carte ( openlayers)
    Par Atika90 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/08/2013, 16h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo