判斷兩線段是否相交

  • 算法一

1. 快速排斥實驗:設一線段P1P2爲對角線的矩形爲P,設一線段Q1Q2爲對角線的矩形爲Q,若是P和Q不相交,顯然兩線段不會相交。算法

如下2種(方法一、方法2)方法判斷矩形是否相交僅限於正矩形spa

方法1:已知2個正矩形rect1: {(minx1, miny1), (maxx1,maxy1)}, rect2: {(minx2,miny2), (maxx2, maxy2)},設兩個正矩形相交必定獲得一個正矩形rect: {(minx, miny), (maxx, maxy)},若是minx > maxx 或 miny > maxy則該2個正矩形rect1和rect2不相交。遞歸

方法2:兩個正矩形的重心距離在X和Y軸上都小於兩個矩形長或寬的一半之和。方法

方法3:若是是非正矩形,那麼須要矩形的每一個邊與另外一個矩形每一條邊判斷是否相交,而且包含關係來判斷矩形是否相交。若是不但願計算也能夠遞歸使用本章節計算方法(快速排斥實驗+跨立實驗)。在計算線段是否相交的時候轉換爲正矩形是否相交,經過比較來實現矩形是否相交。im

2.跨立實驗:若是2個線段相交,則兩個線段必然互相跨立對方。若P1P2的跨立Q1Q2,則矢量(P1-Q1)和(P2-Q1)位於(Q2-Q1)的兩側,(經過矢量叉積判斷拐向)即 (P1-Q1)x(Q2-Q1)x(P2-Q1)x(Q2-Q1) < 0,經過交換律可得 (P1-Q1)x(Q2-Q1)x(Q2-Q1)x(P2-Q1) > 0。當(P1-Q1)x(Q2-Q1) = 0時,說明(P1-Q1)和(Q2-Q1)共線,由於已經經過了快速排斥,因此P1必定是在Q1Q2上。同理Q2-Q1)x(P2-Q1) = 0,則P2必定是在Q1Q2上。綜上P1P2和Q1Q2互相跨立:img

1.(P1-Q1)x(Q2-Q1)x(Q2-Q1)x(P2-Q1) ≥ 0co

2.(Q1-P1)X(P2-P1)x(P2-P1)x(Q2-P1) ≥ 0參數

  • 算法二

定義A、B、C、D是二維空間點,則有向線段AB、CD的參數方程:

AB = A + r(B-A), r ∈[0,1]

CD = C + s(D-C), s ∈[0, 1]

導出:

r = ((Ay-Cy)(Dx-Cx) - (Ax-Cx)(Dy-Cy))/((Bx-Ax)(Dy-Cy) - (By-Ay)(Dx-Cx))

s= ((Ay-Cy)(Bx-Ax) - (Ax-Cx)(By-Ay))/ ((Bx-Ax)(Dy-Cy) - (By-Ay)(Dx-Cx))

定義:設P維直線AB和CD的焦點,則P = (PX, PY) = (Ax+r(Bx-Ax), Ay+r(By-Ay)),若是0≤r≤1而且0≤s≤1,則有向線段AB和CD的焦段存在,不然焦點不存在。

若((Bx-Ax)(Dy-Cy) - (By-Ay)(Dx-Cx)) = 0,則AB和CD平行。

若 ((Ay-Cy)(Dx-Cx) - (Ax-Cx)(Dy-Cy)) = 0,則AB和CD共線。

若直線AB和CD相交,而交點不在線段AB和CD之間,則焦點位置可經過以下判斷:

1. 若r > 1, 則交點P位於有向線段AB的延遲線上。

2.若r < 0,則焦點P位於有向線段BA延長線上。

3.若s > 1,則交點P位於有向線段CD的延遲線上。

4.若s < 0,則交點P位於有向線段DC的延遲線上。

相關文章
相關標籤/搜索