J'ai la question suivante. J'ai une boîte pleine de coordonnées et trois points, qui forment une ligne. Maintenant, je veux calculer la distance la plus courte de toutes les coordonnées de la boîte à cette ligne. J'ai trois méthodes pour le faire et la version vtk et numpy ont toujours le même résultat mais pas la méthode de la distance de shapely. Mais j'ai besoin de la version galbée, parce que je veux mesurer la distance la plus proche d'un point à la ligne de hwole et pas aux segments séparés de ligne. Voici un exemple de code jusqu'à présent. Le problème est le « pdist »:Python: Point le plus proche d'une ligne
from shapely.geometry import LineString, Point
import vtk, numpy as np
import itertools
import math
from numpy.linalg import norm
x1=np.arange(4,21)
y1=np.arange(4,21)
z1=np.arange(-7,6)
linepoints = np.array([[1,10,0],[10,10,0],[15,15,0]])
for i in itertools.product(x1,y1,z1):
for m in range(len(linepoints)-1):
line3 = LineString([linepoints[m],linepoints[m+1]])
p = Point(i)
d = norm(np.cross(linepoints[m]-linepoints[m+1], linepoints[m]-i))/norm(linepoints[m+1]-linepoints[m])
dist=math.sqrt(vtk.vtkLine().DistanceToLine(i,linepoints[m],linepoints[m+1]))
pdist = p.distance(line3)
print(d,dist,pdist)
Ah c'est un problème! Quelle serait alors la meilleure approche pour calculer la distance la plus proche de tous les points 3D à une polyligne? Parce que dans certains cas les points ont la distance la plus proche de l'extension infinie d'un segment de ligne, mais j'ai besoin de la distance la plus proche d'un point sur le segment/ligne et bien sûr dans la direction z aussi. Je pense que c'est ce que vous avez décrit avec cette projection orthogonale? – Varlor
@Vorlor J'ai mis à jour la réponse avec ce que je pense serait une méthode générale. Dans la fonction 'dist', la restriction du paramètre' t' dans l'intervalle '[0,1]' s'assure qu'il calcule la distance jusqu'au segment fini. Sans cette contrainte, il retournerait la distance à la ligne infinie ... – ewcz
Ah sympa, ça marche. Pouvez-vous expliquer ce qui se passe exactement mathématiquement dans les lignes: n, v = b - a, c - a t = max (0, min (np.dot (v, n)/np.dot (n, n) , 1)) renvoie np.linalg.norm (c - (a + t * n)) #ou np.linalg.norm (v - t * n) – Varlor