Ich benutze Python + Numpy (kann vielleicht auch Scipy verwenden) und habe drei 2D-Punkte
(P1, P2, P3);
Ich versuche, den Abstand von P3 senkrecht zu einer Linie zwischen P1 und P2 zu ermitteln. Lassen Sie P1=(x1,y1)
, P2=(x2,y2)
und P3=(x3,y3)
In der Vektor-Notation wäre das ziemlich einfach, aber ich bin relativ neu in Python/Numpy und kann nichts bekommen, was funktioniert (oder sogar nahe kommt).
Irgendwelche Tipps geschätzt, danke!
Versuchen Sie es mit der norm - Funktion von numpy.linalg
d = norm(np.cross(p2-p1, p1-p3))/norm(p2-p1)
np.cross
gibt die Z-Koordinate des Kreuzprodukts nur für 2D-Vektoren zurück. Die erste norm
in der akzeptierten Antwort wird nicht benötigt und ist tatsächlich gefährlich, wenn p3
ein Array von Vektoren und nicht ein einzelner Vektor ist. Am besten nur zu benutzen
d=np.cross(p2-p1,p3-p1)/norm(p2-p1)
für ein Array von Punkten p3
erhalten Sie ein Array von Entfernungen von der Linie.
Damit die oben genannten Antworten funktionieren, müssen die Punkte numpy-Arrays sein. Hier ein Beispiel:
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)
Um die Entfernung zur Linie vom Punkt zu finden, wenn Sie eine Steigung und einen Achsenabschnitt haben, können Sie die Formel aus dem Wiki verwenden https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line Python:
def distance(point,coef):
return abs((coef[0]*point[0])-point[1]+coef[1])/math.sqrt((coef[0]*coef[0])+1)
coef ist ein Tupel mit Gefälle und Achsenabschnitt
abs((x2-x1)*(y1-y0) - (x1-x0)*(y2-y1)) / np.sqrt(np.square(x2-x1) + np.square(y2-y1))
Kann direkt durch die Formel verwendet werden, muss nur die Werte einstecken und Boom es funktioniert.
Dies ist der Code, den ich von https: //www.geeksforgeeks.org erhalten habe:
import math
# Function to find distance
def shortest_distance(x1, y1, a, b, c):
d = abs((a * x1 + b * y1 + c)) / (math.sqrt(a * a + b * b))
print("Perpendicular distance is", d)
Jetzt musst du A, B, C, x und y finden.
import numpy as np
closest = []
x = (x ,y)
y = (x, y)
coef = np.polyfit(x, y, 1)
A = coef[0]
B = coef[1]
C = A*x[0] + B*x[1]
Jetzt können Sie die Werte einstecken:
shortest_dis = shortest_distance(x, y, A, B, C)
Der vollständige Code könnte folgendermaßen aussehen:
import math
import numpy as np
def shortest_distance(x1, y1, a, b, c):
d = abs((a * x1 + b * y1 + c)) / (math.sqrt(a * a + b * b))
print("Perpendicular distance is", d)
closest = []
x = (x ,y)
y = (x, y)
coef = np.polyfit(x, y, 1)
A = coef[0]
B = coef[1]
C = A*x[0] + B*x[1]
shortest_dis = shortest_distance(x, y, A, B, C)
Bitte lassen Sie mich wissen, wenn etwas davon unklar ist.