Ich habe die folgende Frage. Ich habe eine Kiste voller Koordinaten und drei Punkte, die eine Linie bilden. Jetzt möchte ich die kürzeste Entfernung aller Boxkoordinaten zu dieser Linie berechnen. Ich habe drei Methoden, das zu tun und die vtk und numpy Version haben immer das gleiche Ergebnis, aber nicht die Distanzmethode von shapely. Aber ich brauche die formschöne Version, weil ich die kürzeste Entfernung von einem Punkt zu der hwole Linie und nicht zu den einzelnen Liniensegmenten messen möchte. Hier ist ein Beispielcode soweit. Das Problem ist also der „pdist“:Python: Der nächste Punkt zu einer Linie
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 das ist ein Problem! Was wäre dann der beste Ansatz, um den kürzesten Abstand aller 3D-Punkte zu einer Polylinie zu berechnen? Denn in einigen Fällen haben die Punkte den geringsten Abstand zur unendlichen Ausdehnung eines Liniensegments, aber ich benötige den kürzesten Abstand zu einem Punkt auf dem Segment/Linie und natürlich auch in z-Richtung. Ich denke, das haben Sie mit dieser orthogonalen Projektion beschrieben? – Varlor
@Varlor Ich habe update die Antwort mit, was ich denke, wäre eine allgemeine Methode. In der 'dist'-Funktion sorgt die Beschränkung des Parameters' t' in das Intervall '[0,1]' dafür, dass der Abstand zum endlichen Segment berechnet wird. Ohne diese Einschränkung würde die Entfernung zur unendlichen Linie zurückkehren ... – ewcz
Ah schön, es funktioniert. Können Sie erklären, was genau in den Zeilen mathematisch geschieht: n, v = b - a, c - a t = max (0, min (np.dot (v, n)/np.dot (n, n) , 1)) Rückkehr np.linalg.norm (c - (a + t * n)) # oder np.linalg.norm (v - t * n) – Varlor