Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

Python - distance de deux points

Posté par
Bandicootz
13-02-22 à 16:22

Bonjour,

Je tente de comprendre et retranscrire sur Python, la propriété suivante :

Citation :
On se place ici en dimension 2. On appelle chemin de longueur n toute suite de n + 1 points Pi de Z² pour 0 ≤ i ≤ n tel que

Pour tout 0 ≤ i < n, Pi et Pi+1 sont séparés par une distance 1


Pour cela, il faut probablement appliquer la formule qui calcule la distance entre deux points points en l'adaptant à la situation
Et voilà ce que ma tentative de retranscription a donné, et qui relève sans aucun doute des erreurs :

def est_chemin(t):

    n = longueur(t)
    i = 0
    
    for i in range(n):
        return t[i+1] - t[i] = 1


Si vous pouviez m'indiquer où se  trouve le problème, je vous en remercierai.

Posté par
carpediem
re : Python - distance de deux points 13-02-22 à 16:37

salut

puisque la distance entre deux points consécutifs est 1 c'est que tu travailles sur le réseau Z2 R2

donc tu te déplaces d'un point à un autre suivant l'une des quatre directions cardinales N, E, S, O

donc ton script est totalement hors sujet ... ou du moins incompréhensible : que veux-tu faire avec ta fonction ?

Posté par
Bandicootz
re : Python - distance de deux points 13-02-22 à 17:00

Bonjour,

Merci pour ta réponse. En fait, je pensais justement que ma fonction pourrait interpréter le fait qu'un point serait toujours à côté ou au dessus de l'autre, mais effectivement, je m'emmêle les pinceaux. Ça pourrait paraître stupide; j'ai compris le principe, mais je bloque vraiment quand il s'agit de l'expliquer et encore plus sous Python

Posté par
carpediem
re : Python - distance de deux points 13-02-22 à 17:11

de rien ...

mais si tu veux qu'on t'aide il faut justement nous dire plus précisément ce que tu veux faire ...

Posté par
Bandicootz
re : Python - distance de deux points 13-02-22 à 17:25

Désolé pour l'ambiguïté. En fait, je cherche une fonction est_chemin avec pour argument un tableau t de points qui vérifie si deux points consécutifs sont bien à distance 1.
Dans ma logique des choses,  j'aurais utilisé la formule permettant de calculer la distance entre deux points :

\sqrt{(x2-x1)^2+(y2-y1)^2}

Mais comme on sait que la distance est de 1, cela donnerait

\sqrt{(x2-x1)^2+(y2-y1)^2 } = 1

Et à partir de là, je bloque

Posté par
carpediem
re : Python - distance de deux points 13-02-22 à 18:00

mais comment est défini ton tableau de points?

moi je le vois comme une liste de couples : les coordonnées de chaque points donc de la forme [[x_1, y_1], [x_2, y_2], ..., [x_n, y_n]]

est-ce ainsi ?

Posté par
Bandicootz
re : Python - distance de deux points 13-02-22 à 18:10

Plus ou moins, c'est un tableau qui commence ainsi :

[[0,0], [0,1], [-1,1], [-1,2], [-1,3], [-2,3], [-3,3], ...]

Pi = (5, −4) est représenté, par exemple, par la liste [5,-4]

Et moi ce que j'essaie de retranscrire sur Python c'est :

Quelque soit i, ||Pi+1 − Pi|| = 1

Posté par
carita
re : Python - distance de deux points 13-02-22 à 19:02

bonsoir à vous,
juste de passage

pas sûre d'avoir bien compris la question posée ...

comment est construit, au départ,  le tableau que tu passes en argument ?
tu veux juste vérifier si la liste forme un chemin de longueur n ?
le point de départ du chemin est toujours l'origine ?


je voulais juste te signaler, si besoin est , que L= [[0,0], [0,1], [-1,1], [-1,2], [-1,3], [-2,3], [-3,3]] , par exemple,
est une liste de listes.
et donc pour accéder à chaque 'coordonnée' d'un point en particulier, tu peux utiliser cette syntaxe :
pour le 3ème point, par exemple
L[2][0]  --> retourne -1
L[2][1]  --> retourne 1

Posté par
carita
re : Python - distance de deux points 13-02-22 à 19:03

ps : une liste de listes s'appelle aussi une matrice en python.

Posté par
verdurin
re : Python - distance de deux points 13-02-22 à 19:05

Bonsoir,
il suffit de vérifier que t[i+1] - t[i] est dans la liste [[0,1],[0,-1],[1,0],[-1,0]].

Posté par
carita
re : Python - distance de deux points 13-02-22 à 19:16

bonsoir verdurin
j'avais pensé à un quadrillage orthonormé au début, mais c'est peut-être plus compliqué.

s'il suffit que la distance de 2 points consécutifs soit égale à 1, A/C/B/D est un chemin de longueur 3,
mais les coordonnées peuvent être capricieuses...
Python - distance de deux points

... sans doute je n'ai pas bien compris l'énoncé.

Posté par
carpediem
re : Python - distance de deux points 13-02-22 à 19:19

oui bien vu verdurin

et avec une valeur absolue on peut même se limiter à deux éléments ...

Posté par
carita
re : Python - distance de deux points 13-02-22 à 19:22

oups, je viens de réaliser ma bêtise... on est dans Z²
je m'éclipse...

Posté par
verdurin
re : Python - distance de deux points 13-02-22 à 19:25

Salut carita.
Un extrait de l'énoncé :

Citation :
On appelle chemin de longueur n toute suite de n + 1 points Pi de Z² . . .

Il est vrai qu'il n'est pas vraiment mis en valeur.

Posté par
Bandicootz
re : Python - distance de deux points 13-02-22 à 20:13

Et bien désolé d'avoir créé tout un malentendu, comme cela m'a un peu retourné, il se peut que je suis passé à côté de d'autres détails. Je vous remercie tout de même à vous 3 de votre contribution.

Citation :
il suffit de vérifier que t[i+1] - t est dans la liste [[0,1],[0,-1],[1,0],[-1,0]].


Merci pour ce début de sortie de ce long tunnel. Il faut donc faire intervenir la condition [i]if
dans celle de for ou je me trompe ?

Posté par
ty59847
re : Python - distance de deux points 13-02-22 à 20:46

Tu as un chemin comme celui-ci : exemple1 :  [[0,0], [0,1], [-1,1], [-1,2], [-1,3], [-2,3], [-3,3], ...]
Prenons un 2ème exemple :  [[0,0], [0,1], [-1,1], [-1,2], [-1,3],[0,4], [1,4], [1,3], ...]

Le premier chemin est valide, mais pas le 2ème.
Quand on fait la vérification à la main, on fait comment ?
On teste le premier segment  [0,0], [0,1] : c'est bon
Donc on teste le 2ème segment : [0,1], [-1,1] : c'est bon
Puis le 3ème, le 4ème, le 5ème ...
Ici le cinquième segment [-1,3],[0,4] n'est pas bon, donc on ne regarde même pas la suite, et on dit que le chemin n'est pas valide.
Ton programme doit faire la même chose :

Pour chaque segment
    Si le segment n'est pas valide, alors fin du controle, le chemin n'est pas valide , et renvoyer 'le Chemin est NON valide'
    Si le segment est valide, on continue la vérification.
Fin
Si le programme arrive jusqu'ici, ça veut dire que tous les segments sont valides 
Renvoyer 'Le chemin est valide'



Dans ta première proposition, tu faisais plus ou moins cette boucle, sauf que, dès le premier test, tu avais une instruction RETURN
Donc tu testais seulement le premier segment,  et tu ne regardais pas les suivants.

for i in range (n)
   return xxx  ' Forcément, on traite la première valeur de i, et le traitement s'arrete.

Posté par
Bandicootz
re : Python - distance de deux points 13-02-22 à 21:45

Merci beaucoup d'avoir pris le temps de m'expliquer tout cela en détail!
Du coup, voilà ce qu'il en ressort en espérant avoir une bonne saisie.

def est_chemin(t):

    n = len(t)
    i = 0
    
    for i in range(n):
        
        if t[i+1] - t[i] != 1:
            return False
        else:
            return True


La console ne semble m'indiquer aucune erreur, pouvez-vous me le confirmer s'il s'agit bien de l'exécution attendue ?

Posté par
ty59847
re : Python - distance de deux points 13-02-22 à 21:55

Tu as défini cette fonction.
Tu peux tester pour voir si elle donne le résultat voulu.

def est_chemin(t):

    n = len(t)
    i = 0
    
    for i in range(n):
        
        if t[i+1] - t[i] != 1:
            return False
        else:
            return True


tt=  [[0,0], [0,1], [-1,1], [-1,2], [-1,3],[0,4], [1,4], [1,3]]
print(   est_chemin ( tt))

Posté par
Bandicootz
re : Python - distance de deux points 13-02-22 à 22:16

Citation :
line 9, in est_cheminif t[i+1] - t[i] != 1:
TypeError: unsupported operand type(s) for -: 'list' and 'list'


J'en déduis qu'il y a un erreur, mais je ne vois pas comment remanier le code, même après plusieurs tentatives...

Posté par
ty59847
re : Python - distance de deux points 13-02-22 à 22:49

Essaye ce code :


def est_chemin(t):

    n = len(t)
    i = 0
    
    for i in range(n):
        print ( 'controle ' , '  i=', i,  '    t=' , t[i] , '   suivant=' , t[i+1] )
        if t[i+1] - t[i] != 1:
            return False
        else:
            return True

tt=  [[0,0], [0,1], [-1,1], [-1,2], [-1,3],[0,4], [1,4], [1,3]]
print(   est_chemin ( tt))


J'ai juste ajouté une ligne 'Print ... ' pour que le programme t'affiche des informations utiles. Donc il plantera de la même façon.
Mais en regardant les quelques informations affichées, est-ce que tu vois ce qui ne va pas ?

Posté par
carita
re : Python - distance de deux points 13-02-22 à 22:58

bonsoir
t[i]  et  t[i+1] dont des listes;  python ne sait pas soustraire des listes.
(cf mon message de 19h02)

Posté par
carita
re : Python - distance de deux points 13-02-22 à 23:38

par exemple ceci : merci verdurin

def est_chemin(t):
    compteur=i=0
    chemin=True
    while chemin and i<= len(t):
        if abs((t[i+1][0] - t[i][0])) +  abs((t[i+1][1] - t[i][1])) == 1:
            compteur +=1
            i+=1
        else:
            chemin=False
      
    return compteur, t[0:compteur+1]

tt=  [[0,0], [0,1], [-1,1], [-1,2], [-1,3],[1,4], [1,4], [1,3]]
print("chemin de longueur ", est_chemin (tt))


retourne
chemin de longueur  (4, [[0, 0], [0, 1], [-1, 1], [-1, 2], [-1, 3]])


sauf erreur

Posté par
carita
re : Python - distance de deux points 13-02-22 à 23:44

oups

while chemin and i < len(t)-1 :

Posté par
Bandicootz
re : Python - distance de deux points 14-02-22 à 00:02

Merci Carita de la précision et de l'exemple fourni, le message d'erreur en est plus clair. (et pour ton code ty59847, hélas la console ne me donnait pas plus d'indications)

En tout cas, je vous remercie de vous être tous donné du mal!

Je vais essayer de reprendre tout ça demain, bonne nuit

Posté par
ty59847
re : Python - distance de deux points 14-02-22 à 09:12

Le code que je proposais affichait que t[0] était non pas un nombre, mais [0,0]  et t[1] était[0,1] ; il affiche ça juste avant un message de plantage, au moment de la soustraction.
L'idée était de te faire 'deviner' que soustraire ces 2 trucs, ça n"a pas de sens, il faut 'soustraire' comme ce que propose Carita.



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !