私はPython + Numpyを使用しています(おそらくScipyも使用できます)、3つの2Dポイントがあります
_(P1, P2, P3);
_
P3からP1とP2の間に引かれた線に垂直な距離を取得しようとしています。 P1=(x1,y1)
、P2=(x2,y2)
およびP3=(x3,y3)
ベクトル表記では、これは非常に簡単ですが、私はpython/numpyにかなり慣れていないため、動作する(または近い)こともできません。
ヒントはありがたいです、ありがとう!
numpy.linalg
の-norm関数を使用してみてください
d = norm(np.cross(p2-p1, p1-p3))/norm(p2-p1)
np.cross
は、2Dベクトルについてのみ外積のz座標を返します。そのため、受け入れられた回答の最初のnorm
は不要であり、p3
は、単一のベクトルではなくベクトルの配列です。使用するのに最適
d=np.cross(p2-p1,p3-p1)/norm(p2-p1)
これはポイントの配列p3
は、ラインからの距離の配列を提供します。
上記の答えが機能するためには、ポイントはnumpy配列である必要があります。これが実際の例です:
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)
スロープとインターセプトがある場合、ポイントからラインまでの距離を見つけるには、wiki 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は勾配と切片を持つタプルです
abs((x2-x1)*(y1-y0) - (x1-x0)*(y2-y1)) / np.sqrt(np.square(x2-x1) + np.square(y2-y1))
数式から直接使用でき、値をプラグインするだけで機能します。
これは、https://www.geeksforgeeks.orgから取得したコードです。
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)
ここで、A、B、C、x、およびyを見つける必要があります。
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]
これで、値をプラグインできます。
shortest_dis = shortest_distance(x, y, A, B, C)
完全なコードは次のようになります。
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)
不明な点がある場合はお知らせください。