使用geomath包計算點到直線的距離
阿新 • • 發佈:2020-12-28
技術標籤:python的應用
求點到直線的距離是解析幾何中一個非常基礎的問題。我們知道點A的座標(x_a,y_a),和直線BC上兩點B(x_b,y_b)和C(x_c,y_c)的座標,如何求解點A到BC的直線距離呢?我們可以根據以下公式來編寫python程式碼實現功能:
公式描述:公式中的直線方程為Ax+By+C=0,點P的座標為(x0,y0)。
我在github上找到了一個library,叫做GeoMath,作者是一個叫做vmesel的聖保羅小哥,他用面向物件的方式編寫了這個庫,並且上傳到了pypi上,還提供了GeoMath的官方文件(不過官方文件似乎有些地方有bug),主要有三大物件Figure/Line/Point,我們可以用面向物件的程式設計輕鬆地實現解析幾何的各種計算,比如以上公式,我查閱了原始碼,可以發現api是這樣寫的:
def point_distance(self, PointTwo):
EquationA = ((float(self.A) * float(PointTwo.x)) + (float(self.B) * float(PointTwo.y)) + float(self.C))
if EquationA == 0:
raise ValueError('Point is inside the line!')
EquationB = sqrt((float(self.A) * float(self.A)) + (float (self.B) * float(self.B)))
return((float(EquationA) / float(EquationB)))
公式和程式碼基本上一一對應了,很舒服。唯一的區別就是沒有加絕對值,這個正負號可能有方向資訊,如果嚴格定義距離非負的話,我們可以使用絕對值函式進行非負處理。
對於開頭提到的問題,我們可以利用這個api自己簡單封裝一個函式如下,在這個例程中我們假設A的座標為(0,1),B的座標為(1,0),C的座標為(1,1):
from geomath.point import Point
from geomath.line import Line
x_a, y_a = 0,1
x_b,y_b = 1,0
x_c,y_c = 1,1
def point2line_distance(x_a,y_a,x_b,y_b,x_c,y_c):
point_a = Point(x_a,y_a)
point_b = Point(x_b,y_b)
point_c = Point(x_c,y_c)
l1 = Line()
l1.create(point_a, point_b)
return l1.point_distance(point_c)
print(point2line_distance(x_a,y_a,x_b,y_b,x_c,y_c))
執行之後,我們得到計算結果:
這和我們手動計算是一樣的,之後再有類似的問題的話,我們只需要修改座標值就可以秒算答案了,避免了手動計算的繁瑣過程,可以說是非常舒服的了。