背景介紹
最近在水面無人艇(USV)模擬仿真中,用到了一些點和線的關系求解,本文主要講述一下兩點確認直線,點到直線距離,兩條直線的交點等問題的解決方法,並給出python程序。部分內容非原創,文中給出鏈接,需要者可以參考。
博客更新可參見github點線關系
兩點確定直線
表達式定義
空間直線的表達式有多種,比如一般式Ax+By+C=0、點斜式y-y0=k(x-x0)、截距式x/a+y/b=1、兩點式:(y-y1)/(y1-y2)=(x-x1)/(x1-x2)等,它們具有彼此的約束條件,如下所示。
由上可以看出來,一般式的適用范圍最廣,不需要單獨做處理和判斷,所以在計算機領域處理二維圖像數據中一般式用的最多。
已知直線上的兩點P1(X1,Y1)和P2(X2,Y2),P1和P2兩點不重合,對於AX+BY+C=0,則有:
- A=Y2-Y1
- B=X1-X2
- C=X2*Y1-X1*Y2
python源代碼
def GeneralEquation(first_x,first_y,second_x,second_y):
# 一般式 Ax+By+C=0
# from http://www.cnblogs.com/DHUtoBUAA/
A=second_y-first_y
B=first_x-second_x
C=second_x*first_y-first_x*second_y
return A,B,C
點到直線距離
表達式定義
設直線L的方程為Ax+By+C=0,點P的坐標為(x0,y0),則點P到直線L的距離為:
d=\frac{\left | A\times x0+B\times y0+C \right |}{\sqrt{A^{2}+B^{2}}}
博客園對Markdown插入數學公式支持不友好,可以轉移到看github點線關系查看最新版。如果有博客園數學公式插入方法,歡迎留言指教。
兩條直線的交點
表達式定義
在已知直線兩點的情況下,利用上面的直線一般式可以求得直線的參數A、B和C,那么兩條直線的一般式表達可以列成二元一次方程組,其解即為兩條直線的交點坐標。注意處理兩條直線平行的特殊情況。

x=\frac{C2\times B1-C1\times B2}{A1\times B2-A2\times B1}
y=\frac{C1\times A2-C2\times A1}{A1\times B2-A2\times B1}
python源代碼
def GetIntersectPointofLines(x1,y1,x2,y2,x3,y3,x4,y4):
# from http://www.cnblogs.com/DHUtoBUAA/
A1,B1,C1=GeneralEquation(x1,y1,x2,y2)
A2, B2, C2 = GeneralEquation(x3,y3,x4,y4)
m=A1*B2-A2*B1
if m==0:
print("無交點")
else:
x=(C2*B1-C1*B2)/m
y=(C1*A2-C2*A1)/m
return x,y
程序運行結果:兩直線交點為x=32.857142857142854,y=65.71428571428571,符合數學計算。部分內容參考自兩條線段是否相交,計算交點公式。