calcul distance coordonnées dans un array

javascript

a marqué ce sujet comme résolu.

C'est vrai que c'est pas très clair. Je t'explique d'avantage

j'ai trois coordonnées qui stockées dans mon array myArray = [[5,7],[5,8],[2,8]];

Je veux créer une fonction qui renvoie la distance correspondant au parcours entre tous ces points. Ici par exemple, entre le premier et le dernier point il parcourt 4 "cases" (1 case entre le premier et le deuxième point et 3 cases entre le troisième et le dernier point).

C'est plus clair?

+0 -0

Ha ok. Alors il faut prendre les points 2 à 2.

Donc tout d'abord tu prend le premier point $P_0 = (x_0, y_0) = (5, 7)$ et le deuxième $P_1 = (x_1, y_1) = (5,8)$ et tu calcul la distance euclidienne :

$$ d_{01} = \sqrt{(x_0 - x_1)^2 + (y_0 - y_1)^2} = \sqrt{(5 - 5)^2 + (7 - 8)^2} = 1 $$

puis tu fais la meme chose entre le deuxieme et le dernier point :

$$ d_{12} = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2} = \sqrt{(5 - 2)^2 + (8 - 8)^2} = 3 $$

Ta distance total est alors la somme des deux.

A noter que si tu sais que chaque point à une coordonnée commune avec l'autre point (uniquement des ligne horizontal et vertical entre les points), la distance se résume en la somme des valeurs absolus des differences entre les composantes différentes d'un point à l'autre.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
function lineDistance(x1, y1, x2, y2, x3, y3) {

  xs = x2 - x1;
  xs = xs * xs;

  ys = y2 - y1;
  ys = ys * ys;

  xs = x3 - x2;
  xs = xs * xs;

  ys = y3 - y2;
  ys = ys * ys;

return Math.sqrt( xs + ys );

}

console.log(lineDistance(5,7,5,8,2,8));

Vous en pensez quoi? C'est pas très propre quand même non?

Ce serait mieux si je mettais une boîte dialogue ou l'utilisateur peut rentrer des coordonnées et que ma fonction calcule les distances à chaque fois.

Je vais faire ça

Moody_jr

C'est assez sale comme méthode, si tu as 4 points au lieu de 3 comment vas-tu faire ?

Pourquoi ne pas utiliser un objet de type point ? Ensuite faire une liste de points ?

+0 -0

Vous en pensez quoi? C'est pas très propre quand même non?

Ce serait mieux si je mettais une boîte dialogue ou l'utilisateur peut rentrer des coordonnées et que ma fonction calcule les distances à chaque fois.

Je vais faire ça

Moody_jr

C'est assez sale comme méthode, si tu as 4 points au lieu de 3 comment vas-tu faire ?

Pourquoi ne pas utiliser un objet de type point ? Ensuite faire une liste de points ?

Proktor

Oui je suis d'accord c'est assez sale.

Pour rajouter un point, je duplique simplement ce que j'ai déjà fait.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
function lineDistance(x1, y1, x2, y2, x3, y3) {

  xs = x2 - x1;
  xs = xs * xs;

  ys = y2 - y1;
  ys = ys * ys;

  xs = x3 - x2;
  xs = xs * xs;

  ys = y3 - y2;
  ys = ys * ys;

return Math.sqrt( xs + ys );

}

console.log(lineDistance(5,7,5,8,2,8));

Qu'est-ce qu'un objet de type point?

+0 -0

ça aurait une structure de base comme ça donc

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
function Point() {
    this.x = x
    this.y = y
}

Robot.prototype.distanceCoordinates = function() {

    console.log(lineDistance());
}

var points = [
    new Point([5,7]),
    new Point([5,8]),
    new Point([2,8])
];

points.forEach(function(point)) {
    point.distanceCoordinates();
}
+0 -0

Si tu parles de ta fonction distanceCoordinates() il faut la généraliser.

Elle doit calculer la distance entre deux points, combien de paramètres a-t-elle besoin ? !

Je me demande même si on ne pourrait pas utiliser la récursivité ? !

+0 -0

Salut Moody_jr,

As-tu trouvé une solution à ton algorithme finalement ?

Je n'ai aucune compétence en Javascript, donc voici l'implémentation que j'aurais fait en Python. La syntaxe reste très accessible même si tu ne connais pas ce langage.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import math

class Point() :
    def __init__(self, x, y) :
        self.x = x
        self.y = y

def getDist(start_point, end_point) :
""" Calcule la distance euclidienne entre deux points (formule fournie précédemment par Kje)"""
    return math.sqrt((end_point.x - start_point.x)**2 + (end_point.y - start_point.y)**2)

# coordinates est une liste d'objet "Point", que tu initialises avec leur valeurs en abscisses et en ordonnées
coordinates = [Point(0,0), Point(0,1), Point(0,2), Point(0,3)]

dist = 0 #Variable qui stockera la distance totale

for i in range(1,len(coordinates)) : #Pour i de 1 à n-1 (n étant le nombre d'éléments de la liste)
    dist += getDist(coordinates[i-1], coordinates[i])

print(dist)

Si quelqu'un a une autre méthode de calcul, ça m'intéresse :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte