1. 程式人生 > 其它 >使用geomath包計算點到直線的距離

使用geomath包計算點到直線的距離

技術標籤: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))

執行之後,我們得到計算結果:
在這裡插入圖片描述
這和我們手動計算是一樣的,之後再有類似的問題的話,我們只需要修改座標值就可以秒算答案了,避免了手動計算的繁瑣過程,可以說是非常舒服的了。