python判斷兩線段是否相交 判斷兩線段是否相交

2021-10-12 11:49:13 字數 1425 閱讀 6192

演算法一

1. 快速排斥實驗:設一線段p1p2為對角線的矩形為p,設一線段q1q2為對角線的矩形為q,如果p和q不相交,顯然兩線段不會相交。

以下2種(方法1、方法2)方法判斷矩形是否相交僅限於正矩形。

方法1:已知2個正矩形rect1: , rect2: ,設兩個正矩形相交一定得到乙個正矩形rect: ,如果minx > maxx 或 miny > maxy則該2個正矩形rect1和rect2不相交。

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

方法3:如果是非正矩形,那麼需要矩形的每個邊與另乙個矩形每一條邊判斷是否相交,並且包含關係來判斷矩形是否相交。如果不希望計算也可以遞迴使用本章節計算方法(快速排斥實驗+跨立實驗)。在計算線段是否相交的時候轉換為正矩形是否相交,通過比較來實現矩形是否相交。

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互相跨立:

1.(p1-q1)x(q2-q1)x(q2-q1)x(p2-q1) ≥ 0

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共線。

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

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

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

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

判斷兩線段是否相交

兩條線段有且僅有乙個公共點,且這個點不是任何一條線段的端點時,稱這兩條線段是嚴格相交的。也就是說線段不嚴格相交時可以將端點作為交點,但本文不討論不嚴格相交,只討論嚴格相交的情況 即使它們在演算法實現上差別不大 在判斷兩條線段是否相交時,我們常用快速排斥實驗跟跨立實驗這兩種方法,快速排斥實驗能很快的排...

判斷兩線段是否相交

判斷兩線段是否相交 我們分兩步確定兩條線段是否相交 1 快速排斥試驗 設以線段 p1p2 為對角線的矩形為r,設以線段 q1q2 為對角線的矩形為t,如果r和t不相交,顯然兩線段不會相交。2 跨立試驗 如果兩線段相交,則兩線段必然相互跨立對方。若p1p2跨立q1q2 則向量 p1 q1 和 p2 q...

判斷兩個線段是否相交

html xmlns lang en charset utf 8 判斷兩個線段是否相交問題title rel stylesheet href css reset.css rel stylesheet href css style.css head class wrap 判斷兩個線段是否相交h2 br...