1. 程式人生 > >MATLAB實現判斷航跡(直線)是否相交的問題

MATLAB實現判斷航跡(直線)是否相交的問題

航跡躲避時,往往面臨相交問題,這裡給出兩種簡化方法(僅考慮空間上的不相交)。

一. 判斷線段相交

使用solve函式,求新航跡段與其餘航跡的交點,如果交點的橫座標在兩條航跡線段內,則說明相交。要注意求交點時要排除掉障礙物所在航跡(新航跡改變前的航跡),因為它與新航跡一定有一個交點(s,t)

二. 判斷凸多邊形

兩條線相交時,四個端點畫出的是凸多邊形,而不相交時,是凹多邊形

  首先找到鄰近航跡,即判斷從哪個點開始判斷新航跡與此點以後的航跡的位置關係。求(s,t)與每段航跡交接點的距離(除去障礙物所在的航跡),輸出距離最小的點。通過(s,t)與(x,y)所連線段的斜率k與障礙物所在航跡段斜率的比較,可以判斷是上面的點還是下面的點。輸出(nu,nv),nu代表是哪個飛行器的航跡,nv代表這條航跡上的第幾段。

再判斷應該與哪條線畫凸多邊形。從nv開始,求航跡起始點與鄰近航跡每一段端點的斜率,如果k大於這個斜率,說明新航跡肯定不會與

(nu,nv)--(nu,nv+1)這一段航跡相交,再判斷k與下一段的斜率,直到j=n;如果k小於這個斜率,則新航跡與這段航跡畫凸多邊形。

使用convhull函式,畫出一個凸多邊形,再使用inpolygon函式,輸出on判斷(x,y)點是否在多邊形邊上。如果相交,四個點可以畫出一個四邊形,每個點都在邊上,on=1;如果不相交,只能畫出一個三角形,on=0。

更新:

發現某種要畫延長線的情況下,上述判斷出現問題,這時可以做出如下修改:判斷四個點是否都在多邊形上,使用on=4的判據。