Section courante

A propos

Section administrative du site

Calculer la distance entre deux couples (deux points) est souvent utile pour trouver le meilleure chemin sur une carte. La formule pour trouver la distance entre deux points s'inspire de la formule de Pythagore (c2=√a2+b2) et de ses théories sur les triangles. Vous trouverez la réponse que vous souhaitez, à l'aide du code source Pascal suivant:

  1. Program CoordToDelta;
  2.  
  3. Function Sqrt(X:Real):Real;
  4. Var
  5.  A,B,M,XN:Real;
  6. Begin
  7.  If X=0.0Then Begin
  8.   Sqrt:=0.0;
  9.  End
  10.   Else
  11.  Begin
  12.   M:=1.0;
  13.   XN:=X;
  14.   While XN>=2.0 do Begin
  15.    XN:=0.25*XN;
  16.    M:=2.0*M;
  17.   End;
  18.   While XN<0.5 do Begin
  19.    XN:=4.0*XN;
  20.    M:=0.5*M;
  21.   End;
  22.   A:=XN;
  23.   B:=1.0-XN;
  24.   Repeat
  25.    A:=A*(1.0+0.5*B);
  26.    B:=0.25*(3.0+B)*B*B;
  27.   Until B<1.0E-15;
  28.   Sqrt:=A*M;
  29.  End;
  30. End;
  31.  
  32. Function Arctan(X:Real):Real;
  33. Var
  34.  A,B:Real;
  35.  N:Integer;
  36. Begin
  37.  A := 1.0 / Sqrt(1.0 + (X * X));
  38.  B := 1.0;
  39.  For N:=1 to 11 do Begin
  40.   A := (A + B) / 2.0;
  41.   B := Sqrt(A * B);
  42.  End;
  43.  Arctan:=X/(Sqrt(1.0+(X*X))*A);
  44. End;
  45.  
  46. Function Cos(X:Real):Real;
  47. Var
  48.  R,S:Real;
  49.  I:Byte;
  50. Begin
  51.  R:=X*X;
  52.  S:=42.0;
  53.  For I:=10 downto 1 do S:=4.0*I-2.0+(-R)/S;
  54.  S:=S*S;
  55.  Cos:=(S-R)/(S+R);
  56. End;
  57.  
  58. Function Sin(X:Real):Real;
  59. Var
  60.  R,S:Real;
  61.  I:Byte;
  62. Begin
  63.  R:=X*X;
  64.  S:=42.0;
  65.  For I:=10 downto 1 do S:=4.0*I-2.0+(-R)/S;
  66.  Sin:=2.0*X*S/(R+S*S);
  67. End;
  68.  
  69. Function ArcCos(a:Real):Real;Begin
  70.  If Abs(a)=1.0Then ArcCos:=(1-a)*PI/2.0
  71.               Else ArcCos:=Arctan(-a/Sqrt(1-a*a))+2*Arctan(1);
  72. End;  
  73.  
  74. Function CoordToDeltaKm(
  75.  Q1Latitude,Q1LatiDeg:Real;Q1LatiDirection:Char;  
  76.  Q1Longitude,Q1LongDeg:Real;Q1LongDirection:Char;  
  77.  Q2Latitude,Q2LatiDeg:Real;Q2LatiDirection:Char;  
  78.  Q2Longitude,Q2LongDeg:Real;Q2LongDirection:Char  
  79. ):Real;  
  80. Var  
  81.  a1,b1,a2,b2,RawDelta:Real;  
  82. Begin  
  83.  a1:=(Q1Latitude+(Q1LatiDeg/60))*PI/180;  
  84.  If Q1LatiDirection='N'Then a1:=-a1;  
  85.  b1:=(Q1Longitude+(Q1LongDeg/60))*PI/180;  
  86.  If Q1LongDirection='O'Then b1:=-b1;
  87.  a2:=(Q2Latitude+(Q2LatiDeg/60))*PI/180;  
  88.  If Q2LatiDirection='N'Then a2:=-a2;  
  89.  b2:=(Q2Longitude+(Q2LongDeg/60))*PI/180;  
  90.  If Q2LongDirection='O'Then b2:=-b2;  
  91.  RawDelta:=ArcCos(Cos(a1)*Cos(b1)*Cos(a2)*Cos(b2) + Cos(a1)*Sin(b1)*Cos(a2)*Sin(b2) + Sin(a1)*Sin(a2));  
  92.  CoordToDeltaKm:=RawDelta*6378.0;  
  93. End;  
  94.  
  95. Function CoordToDeltaStatuteMiles(  
  96.  Q1Latitude,Q1LatiDeg:Real;Q1LatiDirection:Char;  
  97.  Q1Longitude,Q1LongDeg:Real;Q1LongDirection:Char;  
  98.  Q2Latitude,Q2LatiDeg:Real;Q2LatiDirection:Char;  
  99.  Q2Longitude,Q2LongDeg:Real;Q2LongDirection:Char  
  100. ):Real;  
  101. Var  
  102.  a1,b1,a2,b2,RawDelta:Real;  
  103. Begin  
  104.  a1:=(Q1Latitude+(Q1LatiDeg/60))*PI/180;  
  105.  If Q1LatiDirection='N'Then a1:=-a1;  
  106.  b1:=(Q1Longitude+(Q1LongDeg/60))*PI/180;  
  107.  If Q1LongDirection='O'Then b1:=-b1;  
  108.  a2:=(Q2Latitude+(Q2LatiDeg/60))*PI/180;  
  109.  If Q2LatiDirection='N'Then a2:=-a2;  
  110.  b2:=(Q2Longitude+(Q2LongDeg/60))*PI/180;  
  111.  If Q2LongDirection='O'Then b2:=-b2;  
  112.  RawDelta:=ArcCos(Cos(a1)*Cos(b1)*Cos(a2)*Cos(b2) + Cos(a1)*Sin(b1)*Cos(a2)*Sin(b2) + Sin(a1)*Sin(a2));  
  113.  CoordToDeltaStatuteMiles:=RawDelta*3963.1;  
  114. End;  
  115.  
  116.  
  117. Function CoordToDeltaNauticalMiles(  
  118.  Q1Latitude,Q1LatiDeg:Real;Q1LatiDirection:Char;  
  119.  Q1Longitude,Q1LongDeg:Real;Q1LongDirection:Char;  
  120.  Q2Latitude,Q2LatiDeg:Real;Q2LatiDirection:Char;  
  121.  Q2Longitude,Q2LongDeg:Real;Q2LongDirection:Char  
  122. ):Real;  
  123. Var  
  124.  a1,b1,a2,b2,RawDelta:Real;  
  125. Begin  
  126.  a1:=(Q1Latitude+(Q1LatiDeg/60))*PI/180;  
  127.  If Q1LatiDirection='N'Then a1:=-a1;  
  128.  b1:=(Q1Longitude+(Q1LongDeg/60))*PI/180;  
  129.  If Q1LongDirection='O'Then b1:=-b1;  
  130.  a2:=(Q2Latitude+(Q2LatiDeg/60))*PI/180;  
  131.  If Q2LatiDirection='N'Then a2:=-a2;  
  132.  b2:=(Q2Longitude+(Q2LongDeg/60))*PI/180;  
  133.  If Q2LongDirection='O'Then b2:=-b2;  
  134.  RawDelta:=ArcCos(Cos(a1)*Cos(b1)*Cos(a2)*Cos(b2) + Cos(a1)*Sin(b1)*Cos(a2)*Sin(b2) + Sin(a1)*Sin(a2));  
  135.  CoordToDeltaNauticalMiles:=RawDelta * 3443.9;  
  136. End;
  137.  
  138. BEGIN
  139.  WriteLn('Distance entre Montréal et Paris en Km: ',
  140.          CoordToDeltaKm(45, 31,'N',73, 34,'O',48, 50,'N', 2,  20,'E'):4:8);
  141.  WriteLn('Distance entre Montréal et Paris en Miles: ',
  142.          CoordToDeltaStatuteMiles(45, 31,'N', 73, 34,'O',    48, 50,'N', 2,  20,'E'):4:8);
  143.  WriteLn('Distance entre Montréal et Paris en Miles Nautique: ',
  144.          CoordToDeltaNauticalMiles(45, 31,'N', 73, 34,'O',    48, 50,'N', 2,  20,'E'):4:8);
  145. END.

on obtiendra le résultat suivant:

Calcul la distance entre deux points (0,0)-(10,10): 14.142135623731
Calcul la distance entre deux points (2,2)-(10,10): 11.3137084989848
Calcul la distance entre deux points (1,1)-(8,8): 9.89950


Dernière mise à jour : Mardi, le 25 octobre 2016