python 計算兩直線交點

最近在做圖像的透射變換,有一個關鍵問題就是找到原圖像內四邊形的四個頂點。

在處理過程中,經過霍夫直線檢測後,即可得到四邊形的四邊。而邊的表示形式爲:[x1,y1,x2,y2],即以兩點確定一條直線。

因此,需要通過編寫一個函數計算兩直線交點。

首先,我們定義:直線L1:[x1,y1,x2,y2],直線L2:[x3,y3,x4,y4]

簡單解釋一下原理:

兩點確定一條直線,而每一條直線都可以表示爲:Y=kX+b 的形式(即直線的斜截式方程),找到兩條直線的斜截式方程後聯立方程組,求解。

聯立方程組爲:,其中|,之後任意取線上一點即可得b1與b2,至此兩條直線就已經得到。

之後,推導計算公式

通過聯立的方程組,可以解得橫座標x爲:,取直線L1,將x帶入即可得縱座標y。

最後,考慮特殊情況

某一直線爲水平直線,斜率爲0,此時交點縱座標直接取水平線上兩點任一點的縱座標。(該情況不會引起程序錯誤,因此未加考慮)

某一直線爲豎直直線,斜率不存在,此時交點橫座標直接取豎直線上兩點任一點的橫座標。(代碼考慮L2可能存在該情況)

兩條直線均水平或均豎直,則無交點。(代碼未考慮該情況)

代碼

def cross_point(line1,line2):#計算交點函數
    x1=line1[0]#取四點座標
    y1=line1[1]
    x2=line1[2]
    y2=line1[3]
    
    x3=line2[0]
    y3=line2[1]
    x4=line2[2]
    y4=line2[3]
    
    k1=(y2-y1)*1.0/(x2-x1)#計算k1,由於點均爲整數,需要進行浮點數轉化
    b1=y1*1.0-x1*k1*1.0#整型轉浮點型是關鍵
    if (x4-x3)==0:#L2直線斜率不存在操作
        k2=None
        b2=0
    else:
        k2=(y4-y3)*1.0/(x4-x3)#斜率存在操作
        b2=y3*1.0-x3*k2*1.0
    if k2==None:
        x=x3
    else:
        x=(b2-b1)*1.0/(k1-k2)
    y=k1*x*1.0+b1*1.0
    return [x,y]
對程序進行測試:
line1=[1,1,-1,-1]
line2=[-1,1,1,-1]
print cross_point(line1, line2)

結果如下,且正確:

編程環境爲python2.7,直線的數據結構爲列表。

若有任何問題歡迎交流~謝謝觀看

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章