web-dev-qa-db-de.com

Abstand zwischen Punkt und Linie (von zwei Punkten)

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!

8
user1185675

Versuchen Sie es mit der norm - Funktion von numpy.linalg

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

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.

4

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)
2
Szymon Szott

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

1
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.

1
id101112

Kürzeste Entfernung zwischen Punkt und Linie

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.

0
Song