第1 步:快速排斥試驗,如果分別以p1p2 ,p3p4 為對角線做矩形,
而這兩個矩形不相交,則這兩條線段肯定不相交,
如下左圖;
即使兩個矩形相交,這兩條線段也不一定相交
,如下右圖,這時再用第
2 步判斷;
表示成語句,即兩個矩形相交當且僅當下列式子為真:
(max(x1,x2)≥min(x3,x4))∧ (max(x3,x4)≥min(x1,x2)) ∧(max(y1,y2)≥min(y3,y4))∧(max(y3,y4)≥min(y1,y2))
兩個矩形相交必須在兩個方向上都相交,式子的前半部分判斷在x 方向上是否相
交,後半部分判斷在y 方向上是否相交。
第2 步:確定每條線段是否「跨立」另一條線段所在的直線。
跨立:如果點p1 處於直線p3p4
的一邊,而p2處於該直線的另一邊,則我們說線段p1p
2跨立直線p3p4,如果p1 或p2 在直線p3p4 上,也算跨立。
兩條線段相交當且僅當它們能夠通過第1 步的快速排斥試驗,並且每一條線段都跨立另一條線段所在的直線。
具體第2 步的實現,只要用叉積去做就可以了,即只要判斷向量p1
p3和p
1p4是否在p1
p2的兩邊相對的位置上
,如果這樣,則線段p1
p2跨立直線p3p4。也即檢查叉積(p3-p1)×(p2-p1)與(p4-p1)×(p2-p1)的符號是否相同,相同則不跨立,線段也就不相交,否則相交。
當然也有一些特殊情況需要處理,如任何乙個叉積為0,則p3 或p4 在直線p1p2 上,又因為通過了快速排斥試驗,所以下圖左邊的情況是不可能出現的,只會出現右邊的兩種情況。當然,還會出現一條或兩條線段的長度為0,如果兩條線段的長度都是0,則只要通過快速排斥試驗就能確定;如果僅有一條線段的長度為0,如p
3p4的長度為0,則線段相交當且僅當叉積(p3-p1)×(p2-p1)。
有關於叉積的概念:
向量的向量積(叉乘、叉積)
① 向量積的一般含義:兩個向量a 和b 的向量積是乙個向量,記作a×b,其模等於由a 和b作成的平行四邊形的面積,方向與平行四邊形所在平面垂直,當站在這個方向觀察時,a 逆時針轉過乙個小於π的角到達b 的方向。這個方向也可以用物理上的右手螺旋定則判斷:右手四指彎向由a 轉到b 的方向**過的角小於π),拇指指向的就是向量積的方向。如下圖(左)。
② 我們給出叉積的等價而更有用的定義,把叉積定義為乙個矩陣的行列式:
如上右圖,如果
p1× p2為正數,則相對原點(0,0)來說, p1在p 2 的順時針方向; 如果p 1 × p2為負數,則p 1 在p 2 的逆時針方向。如果p 1× p2 =0,則p 1和p 2模相等且共線,方向相同或相反。
③ 給定兩個向量:
p0p1和p0p2,對它們的公共端點p0來說,判斷p0p1是否在p0p2的順時針方向。
方法:如上圖,把
0 p 作為原點,得出向量p1』=p1-p0 和p2』=p2-p0,因此,這兩個向量的叉積為: 如
果該叉積為正,則p0
p1在p
0p2的順時針方向
,如果為負,則p0
p1在p
0p2的逆時針方向
。如果等於0,則
p0,p1,
p2三點共線。
④ 討論另乙個重要問題:確定連續線段是向左轉還是向右轉,如下圖,即兩條連續線段
p0p1 和
p1p2在點p1 是向左轉還是向右轉。也即∠p1p0p2的轉向。
方法:叉積,同上。
排 快速排序
思路 分為交換和遞迴。交換 從右往左 如果值 當前值,則跳過 從左往右 如果值 當前值,則跳過 基準數 int temp arr left 遞迴 方法 quicksort arr,left,i 1 quicksort arr,i 1,right 遞迴出口 if left right public s...
線段相交判斷
1.快速排斥實驗。設以線段p1p2為對角線的矩形為r,設以線段q1q2為對角線的矩形為t,如果r和t不相交,則兩線段不相交。所以p1p2和q1q2相交的必要條件是以他們為對角線的矩形相交,即 min p1.x,p2.x max q1.x,q2.x min q1.x,q2.x max p1.x,p2....
python判斷兩線段是否相交 判斷兩線段是否相交
演算法一 1.快速排斥實驗 設一線段p1p2為對角線的矩形為p,設一線段q1q2為對角線的矩形為q,如果p和q不相交,顯然兩線段不會相交。以下2種 方法1 方法2 方法判斷矩形是否相交僅限於正矩形。方法1 已知2個正矩形rect1 rect2 設兩個正矩形相交一定得到乙個正矩形rect 如果minx...