Distance entre 2 points

dthuler Messages postés 121 Date d'inscription dimanche 9 mars 2003 Statut Membre Dernière intervention 29 avril 2009 - 16 mars 2007 à 23:00
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 - 17 mars 2007 à 12:00
Bonjour,

Je cherche la distance entre 2 points définis par les coordonnées cartésiennes. Pour ce faire, j'utilise la formule suivante :

Sqr((Longi - !CoordX) ^ 2 + (Latit - !CoordY) ^ 2)

Comme c'est dans une itération (une boucle quoi), vous aurez vite compris que ce n'est pas ce que l'on peut appeler "optimisé"...
Quelqu'un sait-il si on peut faire (beaucoup) mieux ? Et question subsidiaire; ce serait cool si cette solution fonctionne avec la prochaine version contenant les coordonnées 3D...

Merci pour votre aide...

~~ Brainiax ~~ [8D]

~~ Brainiax ~~ [8D]
A voir également:

4 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
16 mars 2007 à 23:28
pas mieux Sqr est assez rapide

Sqr((Longi - CoordX) ^ 2 + (Latit - CoordY) ^ 2 + (Azimut - CoordZ) ^ 2)

    Dim i  As Long
    Dim j  As Long
    Dim Lx As Single
    Dim Ly As Single
    Dim d  As Double
    Dim x  As Single
    Dim y  As Single
    Dim Tp As Long
   
    Lx = Line1.x2 - Line1.x1
    Ly = Line1.Y2 - Line1.Y1
   
    Tp = GetTickCount
    For i = 1 To 1000000
        d = Sqr(Lx * Lx + Ly * Ly)
        Next
    Tp = GetTickCount - Tp
    MsgBox "temps=" & Tp
    MsgBox "distance=" & d
   
    Tp = GetTickCount
    For i = 1 To 1000000
        x = Lx * Lx + Ly * Ly
        CopyMemory j, x, 4&
        j = &H5F375A86 - j / 2
        CopyMemory y, j, 4&
        d = y * x
        d = (d + x / d) / 2
        Next
    Tp = GetTickCount - Tp
    MsgBox "temps=" & Tp
    MsgBox "distance=" & d

Daniel
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
17 mars 2007 à 08:50
Bonjour,
Il va bien falloir extraire la recine carrée d'une somme de 2 carrés (c'est inévitable).

 2 possibilités alors :
1) utiliser  le passage à la puissance 2 avec ^2 pour chaque côté  puis utiliser SQR ou 1/2 pour extraire la racine carrée desde la somme des deux carrés obtenus (celle déjà mise en oeuvre ici)
2) travailler avec les fonctions Log et Exp (le log du carré d'un nombre est = 2 * le log de ce nombre et appliguer ensuite Exp au log ainsi obtenu)

Franchement : je ne vois pas le temps qui serait ainsi gagné, sauf si Windows possède déja en mémoire une table des logarithmes, ce qui supprimerait un calcul (remplacé par une lecture).

Voilà ....
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
17 mars 2007 à 09:11
Euh...(je vais mal, ce matin, moi... en additionnant des logs !...)

Correction : on ne pourrait "grignoter" que pour l'extraction de la racine carrée de la somme des carrés ..

 Private Sub Command3_Click()
   a = 2
   b = 5
   n = a ^ 2 + b ^ 2
   MsgBox Sqr(n)  & "  " & Exp(Log(n) / 2)    ' égalité des 2 résultats)
End Sub
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
17 mars 2007 à 12:00
Salut,
Attention, en VB.Net (et je crois me rapeller que c'est pareil en VB6) le symbole exposant ^ ne fais pas la différence d'algorithme pour faire ^2 ou ^1354.354135 et donc le temps de faire a^2 est de l'ordre de 100 fois plus lent que a*a.
Sinon pour ce qui est de la racine, regarde si tu ne peux pas utiliser la distance au carrée, ou la valeur absolue de la somme de la différence des composantes s'il s'agit uniquement de comparaisons.
(En effet si a est plus loin de b que c nous avons
dist(a,c)>dist(b,c)
et donc forcément
dist(a,c)^2>dist(b,c)^2
ou encore
|a-c|>|b-c|)

<hr size="2" width="100%" />Julien.
0
Rejoignez-nous