DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 2009
-
21 janv. 2006 à 11:41
posop
Messages postés1Date d'inscriptionvendredi 16 avril 2010StatutMembreDernière intervention12 mai 2010
-
12 mai 2010 à 12:50
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
posop
Messages postés1Date d'inscriptionvendredi 16 avril 2010StatutMembreDernière intervention12 mai 2010 12 mai 2010 à 12:50
salut
j'ai télécharger le zip
mais comment ouvrir l'interface?
merci de répondre
pbg40
Messages postés1Date d'inscriptionjeudi 14 mai 2009StatutMembreDernière intervention28 août 2009 28 août 2009 à 17:37
Un peu étonnant, si vous utilisez le code tel quel, il génère une erreur de l'ordre de +10%. La faute au rayon de la terre (ligne 106) codé à 6535 alors qu'il est de 6371 km (+ ou - 5km).
sberdli
Messages postés2Date d'inscriptionmercredi 1 mars 2006StatutMembreDernière intervention22 novembre 2007 28 juil. 2008 à 12:52
une daube quoi....
sneb6
Messages postés1Date d'inscriptionjeudi 8 novembre 2007StatutMembreDernière intervention 8 novembre 2007 8 nov. 2007 à 18:37
bon je c ke vou allé dire ke je suis nul mé la g besoin d'aide. g télécharger le fichier zip mé une fois décompréssé j'obtien des fichier keje peu ouvir mé ki son écri dans un charabia. commen pourége faire pour pouvoir utilisé le logiciel merci de me répondre ^_^
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 26 janv. 2006 à 10:41
patch rapide pour ValidFloat :
function ValidFloat(const S : string) : boolean;
var VX : integer;
const
// ensemble des nombres
VN : set of char = ['0'..'9'];
// ensemble nombres et separateur de decimales
VES : set of char = ['0'..'9','.',','];
function CountAChar(const C : char) : integer;
var CX : integer;
begin
result := 0;
for CX := 1 to Length(S) do begin
if S[CX] = C then Result := Result + 1;
end;
end;
begin
// par defaut on considere que le chiffre representé n'est pas valide.
result := false;
IF
// si la chaine est vide ou bien
(length(S) = 0) or
// si le premier et le dernier caractere n'est pas un chiffre ou bien
( (NOT (S[1] IN VN)) or (NOT (S[Length(S)] IN VN)) ) or
// si il y a plusieurs separateurs identique dans la chaine ou bien
( (CountAChar('.') > 1) or (CountAChar(',') > 1) ) or
// si il y a (au moins) deux separateur different dans la chaine alors
( (pos('.',s) <> 0) and (pos(',',s) <> 0) )
THEN
// on sort...
exit;
for VX := 1 to length(s) do begin
// si l'un des caracteres est invalide on sort...
if NOT (S[VX] IN VES) then exit;
end;
// si tout vas bien jusqu'ici, c'est que la chaine represente bien un nombre valide.
result := true;
end;
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 26 janv. 2006 à 10:24
j'oublis toujours un truc :
performance de StringToFloat : 250ms / 500000rq (0.0005ms/rq)
preformance de ValidFloat : 155ms / 500000rq (0.0003ms/rq)
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 26 janv. 2006 à 10:17
utilise l'unitée Math pour ArcCos :
function ArcCos(const X: Extended): Extended;
begin
Result := ArcTan2(Sqrt(1 - X * X), X);
end;
convertir une chaine en nombre flottant avec gestion auto du separateur de decimales :
function StringToFloat(const S : string;const def : real = 0) : real;
var SDS : char;
begin
// sauvegarde de la valeur de DecimalSeparator
SDS := DecimalSeparator;
// on selectionne le bon separateur (attention, methode imcompatible avec les threads)
if pos('.',s) <> 0 then DecimalSeparator := '.'
else
if pos(',',s) <> 0 then DecimalSeparator := ',';
// convertion
result := StrToFloatDef(s,def);
// on restaure DecimalSeparator
DecimalSeparator := SDS;
end;
verifier si une chaine represente un nombre (flottant ou non) valide :
function ValidFloat(const S : string) : boolean;
var VX : integer;
const
VN : set of char = ['0'..'9','.',','];
function CountAChar(const C : char) : integer;
var CX : integer;
begin
result := 0;
for CX := 1 to Length(S) do begin
if S[CX] = C then Result := Result + 1;
end;
end;
begin
result := false;
if (length(S) = 0) or
((S[1] = '.') or (S[1] = ',')) or
((S[length(S)] = '.') or (S[length(S)] = ',')) or
((CountAChar('.') > 1) or (CountAChar(',') > 1)) or
((pos('.',s) <> 0) and (pos(',',s) <> 0)) then exit;
for VX := 1 to length(s) do begin
if S[VX] IN VN then
result := true
else begin
result := false;
exit;
end;
end;
end;
pour les retour de valeur dans les captions, prefere :
distance.Caption := format('%.4f Km',[d]);
DeltaFX
Messages postés449Date d'inscriptionlundi 19 avril 2004StatutMembreDernière intervention 8 avril 20092 21 janv. 2006 à 11:41
T'aurais pu commenter un poil, genre declarer :
const Rt=6378187; //Rayon Terre en mètre (en gros hein...)
Et blinder les cas selon lattitude Nord ou sud, et longitude Est ou West, ou au moins commenter.
Aller hop, t'as plus qu'a coder la lectures des sentences $GPGLL, $GPGGA, $GPRMC sur un port série (lol) en sachant qu'une sentence NMEA s'exprime en "DDDMM.mmmm".
12 mai 2010 à 12:50
j'ai télécharger le zip
mais comment ouvrir l'interface?
merci de répondre
28 août 2009 à 17:37
28 juil. 2008 à 12:52
8 nov. 2007 à 18:37
26 janv. 2006 à 10:41
function ValidFloat(const S : string) : boolean;
var VX : integer;
const
// ensemble des nombres
VN : set of char = ['0'..'9'];
// ensemble nombres et separateur de decimales
VES : set of char = ['0'..'9','.',','];
function CountAChar(const C : char) : integer;
var CX : integer;
begin
result := 0;
for CX := 1 to Length(S) do begin
if S[CX] = C then Result := Result + 1;
end;
end;
begin
// par defaut on considere que le chiffre representé n'est pas valide.
result := false;
IF
// si la chaine est vide ou bien
(length(S) = 0) or
// si le premier et le dernier caractere n'est pas un chiffre ou bien
( (NOT (S[1] IN VN)) or (NOT (S[Length(S)] IN VN)) ) or
// si il y a plusieurs separateurs identique dans la chaine ou bien
( (CountAChar('.') > 1) or (CountAChar(',') > 1) ) or
// si il y a (au moins) deux separateur different dans la chaine alors
( (pos('.',s) <> 0) and (pos(',',s) <> 0) )
THEN
// on sort...
exit;
for VX := 1 to length(s) do begin
// si l'un des caracteres est invalide on sort...
if NOT (S[VX] IN VES) then exit;
end;
// si tout vas bien jusqu'ici, c'est que la chaine represente bien un nombre valide.
result := true;
end;
26 janv. 2006 à 10:24
performance de StringToFloat : 250ms / 500000rq (0.0005ms/rq)
preformance de ValidFloat : 155ms / 500000rq (0.0003ms/rq)
26 janv. 2006 à 10:17
function ArcCos(const X: Extended): Extended;
begin
Result := ArcTan2(Sqrt(1 - X * X), X);
end;
----------------------------------------------------------------------------------------
convertir une chaine en nombre flottant avec gestion auto du separateur de decimales :
function StringToFloat(const S : string;const def : real = 0) : real;
var SDS : char;
begin
// sauvegarde de la valeur de DecimalSeparator
SDS := DecimalSeparator;
// on selectionne le bon separateur (attention, methode imcompatible avec les threads)
if pos('.',s) <> 0 then DecimalSeparator := '.'
else
if pos(',',s) <> 0 then DecimalSeparator := ',';
// convertion
result := StrToFloatDef(s,def);
// on restaure DecimalSeparator
DecimalSeparator := SDS;
end;
----------------------------------------------------------------------------------------
verifier si une chaine represente un nombre (flottant ou non) valide :
function ValidFloat(const S : string) : boolean;
var VX : integer;
const
VN : set of char = ['0'..'9','.',','];
function CountAChar(const C : char) : integer;
var CX : integer;
begin
result := 0;
for CX := 1 to Length(S) do begin
if S[CX] = C then Result := Result + 1;
end;
end;
begin
result := false;
if (length(S) = 0) or
((S[1] = '.') or (S[1] = ',')) or
((S[length(S)] = '.') or (S[length(S)] = ',')) or
((CountAChar('.') > 1) or (CountAChar(',') > 1)) or
((pos('.',s) <> 0) and (pos(',',s) <> 0)) then exit;
for VX := 1 to length(s) do begin
if S[VX] IN VN then
result := true
else begin
result := false;
exit;
end;
end;
end;
----------------------------------------------------------------------------------------
a la place de :
result:=(d+(m+s/60)/60) / 180*pi;
utlise (si je me trompe pas) :
result := DegToRad((d+(m+s/60)/60));
----------------------------------------------------------------------------------------
pour les retour de valeur dans les captions, prefere :
distance.Caption := format('%.4f Km',[d]);
21 janv. 2006 à 11:41
const Rt=6378187; //Rayon Terre en mètre (en gros hein...)
Et blinder les cas selon lattitude Nord ou sud, et longitude Est ou West, ou au moins commenter.
Aller hop, t'as plus qu'a coder la lectures des sentences $GPGLL, $GPGGA, $GPRMC sur un port série (lol) en sachant qu'une sentence NMEA s'exprime en "DDDMM.mmmm".
http://vancouver-webpages.com/peter/nmeafaq.txt
Bon codage.