Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: AndreaM - Agosto 25, 2013, 07:46:17 pm

Titolo: Da JavaScript a Pascal
Inserito da: AndreaM - Agosto 25, 2013, 07:46:17 pm
Salve a tutti, ho provato a trasformare una funzione trovata su
http://www.movable-type.co.uk/scripts/latlong-vincenty.html (http://www.movable-type.co.uk/scripts/latlong-vincenty.html)
che permette di calcolare la distanza di due punti sulla terra.
In fondo alla pagina è riportato il codice JavaScript che svolge questa funzione
Io ho provato a convertirla in pascal ed il risultato dovrebbe essere:
Codice: [Seleziona]
Function DistVincenty(const Lat1, Lon1, Lat2, Lon2: double): Double;
const a=6378137; // semiasse maggiore della terra in m
      b=6356752.314245; // semiasse minore della terra in m
var f,  // schiacciamento (a-b)/a
    l,  // differenza di longitudine
    lambda, lambdaP, U1, U2, sinU1, sinU2, cosU1, cosU2, sinLambda, cosLambda,
    sinSigma, cosSigma, sigma, sinAlpha, cosSqAlpha, cos2SigmaM, c, uSq,
    Aa, Bb, DeltaSigma, s
    :double;
    IterLimit // limite delle iterazioni
    :integer;
begin
//f:=(a-b)/a; // calcolo dello schiacciamento
f:=  1/298.257223563;
l:=degtorad(Lon2-Lon1);
U1:=arctan((1-f)*tan(degtorad(Lat1)));
U2:=arctan((1-f)*tan(degtorad(Lat2)));
sinU1:=sin(U1); cosU1:=cos(U1);
sinU2:=sin(U2); cosU2:=cos(U2);
lambda:=l;
IterLimit:=100;
repeat
  sinLambda:=sin(lambda); cosLambda:=cos(lambda);
  sinSigma:=sqrt((cosU2*sinLambda) * (cosU2*sinLambda) +
      (cosU1*sinU2-sinU1*cosU2*cosLambda) * (cosU1*sinU2-sinU1*cosU2*cosLambda));
  if sinSigma=0 then begin
                     Result:=0; // punti coincidenti
                     exit;
                     end;
  cosSigma:=sinU1*sinU2 + cosU1*cosU2*cosLambda;
  sigma:=arctan2(sinSigma, cosSigma);
  sinAlpha:=cosU1*cosU2*sinLambda/sinSigma;
  cosSqAlpha:=1-sinAlpha*sinAlpha;
  if cosSqAlpha>0 then
    cos2SigmaM:=cosSigma - 2*sinU1*sinU2/cosSqAlpha
    else cos2SigmaM:=0; // linea equatoriale
  C:= f/16*cosSqAlpha*(4+f*(4-3*cosSqAlpha));
  lambdaP:=lambda;
  lambda:=L + (1-C) * f * sinAlpha *
      (sigma + C*sinSigma*(cos2SigmaM+C*cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)));
  Dec(IterLimit);
until ((abs(lambda-lambdaP)>1e-12) and (IterLimit>=0));
if IterLimit=100 then
                 begin
                 Result:=NaN;
                 exit;
                 end;
uSq:=cosSqAlpha * (a*a - b*b) / (b*b);
Aa:= 1 + uSq/16384*(4096+uSq*(-768+uSq*(320-175*uSq)));
Bb:= uSq/1024 * (256+uSq*(-128+uSq*(74-47*uSq)));
deltaSigma:= Bb*sinSigma*(cos2SigmaM+Bb/4*(cosSigma*(-1+2*cos2SigmaM*cos2SigmaM)-
    Bb/6*cos2SigmaM*(-3+4*sinSigma*sinSigma)*(-3+4*cos2SigmaM*cos2SigmaM)));
s:= b*Aa*(sigma-deltaSigma);
Result:=s;
end;             
Dopo averlo letto e riletto decine di volte, non ho trovato spiegazione del perchè sul sito si ottiene un risultato diverso da quello che restituisce la funzione pascal. in Lazarus
Dove è l'errore?????
Ci stò diventando matto!!! :'( :'(
Datemi una mano per cortesia!!
Salutoni a tutti
Titolo: Re:Da JavaScript a Pascal
Inserito da: Stilgar - Agosto 25, 2013, 09:35:45 pm
Hai provato a mettere Extended al posto di Double?
(Non ho letto il codice js e quello pascal merita un attimo di attenzione prima di entrare nel merito ;) )
Titolo: Re:Da JavaScript a Pascal
Inserito da: xinyiman - Agosto 27, 2013, 01:48:50 pm
Allora con il suggerimento di Stilgar hai risolto?
Titolo: Re:Da JavaScript a Pascal
Inserito da: AndreaM - Agosto 27, 2013, 06:56:59 pm
Grazie ragazzi,
Scusate per il ritardo ma il lavoro....
L'errore l'ho trovato, ma ho trovato anche qualche cosa di più grazie a google...http://www.programmersheaven.com/download/48584/19/zipview.aspx (http://www.programmersheaven.com/download/48584/19/zipview.aspx)
Grazie per la vostra disponibilità!
Andrea