計算幾何中最基本重要的演算法之一~判斷線段相交基礎。
只需判斷線段是否同時滿足
1.快速排斥實驗
2.跨立實驗
1.快速排斥實驗:
設以線段p1p2為對角線的矩形為t,以q1q2線段為對角線的矩形為r,那麼下圖這種狀態時p1p2和q1q2肯定不相交
判斷p1 p2 q1 q2是否滿足這種關係就是快速排斥實驗。
max(p1.x,p2.x) < min(q1.x,q2,x) || max(q1.x,q2.x) < min(p1,x,p2,x) ||max(p1.y,p2.y) < min(q1.y,q2,y) || max(q1.y,q2.y) < min(p1.y,p2.y)
上式為真,則表明兩個矩形不想交,一般是取上式的否定,直接判斷是否滿足矩形相交,即。
min(p1.x,p2.x) <= max(q1.x,q2,x) && min(q1.x,q2.x) <= max(p1,x,p2,x) &&min(p1.y,p2.y) <= max(q1.y,q2,y) && min(q1.y,q2.y) <= max(p1.y,p2.y)
2.跨立實驗
前提:如果兩線段相交,必定互相跨立。
也即是說:
1.p1 p2 在q1q2的兩側
2.q1q2 在p1p2的兩側
判斷兩點是否在一條直線的兩側就用到叉乘了。
(q1p1 x q1q2) * (q1q2 x q1p2) <= 0 表示p1p2在q1q2的兩側
(p1q2 x p1p2) * (p1p2 x p1q2) <= 0 表示q1q2在p1p2的兩側
這就滿足跨立實驗的要求了~
小試一下:hdu 1086
#include#include//注意題目說了線段與線段之間最多只有乙個交點,不存在重合或者在一條直線的情況struct line;
long judge(struct line line1,struct line line2)//跨立實驗
int main()
return 0;
}
計算幾何 判斷線段相交(一)
兩個線段的交點個數可能有0個 1個或者無數個 判斷兩個線段相交,可以按照如下步驟 計算叉積時異號 計算叉積時異號 3.下面是判斷線段相交的程式 include include using namespace std define min x,y x define max x,y x y x y co...
計算幾何之判斷線段相交
計算幾何 判斷線段相交 time limit 1000ms memory limit 65536k description 線段相交 linecross.pas c cpp 問題描述 基本問題 判斷二維平面上的兩條線段是否相交。注意 相交有很多種,這裡指的 相交 是指兩條線段恰好有唯一乙個不是端點的...
計算幾何之判斷線段相交
兩條線段可以看作是兩個向量 一條線段跨立另一條線段的條件是 一條線段的端點分別到另一條線段兩個端點構成的向量在該線段兩側 可能不相交 而兩條線段互相跨立,即相交,就可判斷。模板分享 include include include include define equals a,b fabs a b ...