web-dev-qa-db-fra.com

Distance entre un point et une ligne (à partir de deux points)

J'utilise Python + Numpy (peut-être aussi utiliser Scipy) et j'ai trois points 2D 

(P1, P2, P3); 

J'essaie d'obtenir la distance de P3 perpendiculairement à une ligne tracée entre P1 et P2. Soit P1=(x1,y1), P2=(x2,y2) et P3=(x3,y3)

En notation vectorielle, cela serait assez facile, mais je suis assez novice en python/numpy et je ne peux obtenir aucun résultat qui fonctionne (ou même proche).

Tous les conseils appréciés, merci!

8
user1185675

Essayez d’utiliser la fonction norm de numpy.linalg

d = norm(np.cross(p2-p1, p1-p3))/norm(p2-p1)
15
DotPi

np.cross renvoie la coordonnée z du produit croisé uniquement pour les vecteurs 2D. Ainsi, la première norm dans la réponse acceptée n'est pas nécessaire et est en fait dangereuse si p3 est un tableau de vecteurs plutôt qu'un seul vecteur. Mieux juste pour utiliser

d=np.cross(p2-p1,p3-p1)/norm(p2-p1)

qui pour un tableau de points p3 vous donnera un tableau de distances de la ligne.

4
Martin Hardcastle

Pour que les réponses mentionnées ci-dessus fonctionnent, les points doivent être des tableaux numpy, voici un exemple concret:

import numpy as np
p1=np.array([0,0])
p2=np.array([10,10])
p3=np.array([5,7])
d=np.cross(p2-p1,p3-p1)/np.linalg.norm(p2-p1)
2
Szymon Szott
abs((x2-x1)*(y1-y0) - (x1-x0)*(y2-y1)) / np.sqrt(np.square(x2-x1) + np.square(y2-y1))

Peut être utilisé directement dans la formule, il suffit de brancher les valeurs et de faire bouger les choses.

1
id101112