web-dev-qa-db-ja.com

ポイントとライン間の距離(2ポイントから)

私はPython + Numpyを使用しています(おそらくScipyも使用できます)、3つの2Dポイントがあります

_(P1, P2, P3); 
_

P3からP1とP2の間に引かれた線に垂直な距離を取得しようとしています。 P1=(x1,y1)P2=(x2,y2)およびP3=(x3,y3)

ベクトル表記では、これは非常に簡単ですが、私はpython/numpyにかなり慣れていないため、動作する(または近い)こともできません。

ヒントはありがたいです、ありがとう!

13
user1185675

numpy.linalgの-​​norm関数を使用してみてください

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

np.crossは、2Dベクトルについてのみ外積のz座標を返します。そのため、受け入れられた回答の最初のnormは不要であり、p3は、単一のベクトルではなくベクトルの配列です。使用するのに最適

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

これはポイントの配列p3は、ラインからの距離の配列を提供します。

6

上記の答えが機能するためには、ポイントは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)
5
Szymon Szott

スロープとインターセプトがある場合、ポイントからラインまでの距離を見つけるには、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は勾配と切片を持つタプルです

1
abs((x2-x1)*(y1-y0) - (x1-x0)*(y2-y1)) / np.sqrt(np.square(x2-x1) + np.square(y2-y1))

数式から直接使用でき、値をプラグインするだけで機能します。

1
id101112

ポイントからラインまでの最短距離

これは、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)

不明な点がある場合はお知らせください。

0
Song