Distance entre 2 points

Messages postés
123
Date d'inscription
dimanche 9 mars 2003
Statut
Membre
Dernière intervention
29 avril 2009
- - Dernière réponse : 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]
Afficher la suite 

4 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
21
0
Merci
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
Commenter la réponse de Gobillot
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
18
0
Merci
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à ....
Commenter la réponse de jmfmarques
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
18
0
Merci
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
Commenter la réponse de jmfmarques
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
6
0
Merci
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.
Commenter la réponse de Julien237