判斷兩條直線是否相交,有兩個步驟確定:
1、快速排斥。 2、跨立實驗(啊啊啊,逼格好高)
然而事實解法的逼格卻。。。
一 、快速排斥簡單的說就是確保他們能相交的基本的要求是滿足的:
如上圖,明顯的,要兩個線段相交,就要豎直方向有重疊(min(a.y, b.y) < max(d.y, c.y) && max(a.y, b.y) > min(d.y, c.y))
和水平方向有重疊(min(a.x, b.x) < max(c.x, d.x) && min(c.x, d.x) < max(a.x, b.x));覺得好low
二、跨立實驗
如果兩條線段相交,那麼必須跨立,就是以一條線段為標準,另一條線段的兩端點一定在這條線段的兩端
用到叉積的知識,通過正負來判斷一條線段兩個點的相對位置;
貼上板子:
1/***************************************線段相交模板****************************************/2
struct point
5 point(int a,intb)9
void input()
12};
13struct line
16line(point x,point y)
20void
input()
24};
25bool judge(point &a,point &b,point &c,point &d)
2649
50/*
**************************************線段相交模板***************************************
*/
兩線段相交問題
給出平面上兩條線段的兩個端點,判斷這兩條線段是否相交 有乙個公共點或有部分重合認為相交 如果相交,輸出 yes 否則輸出 no input 第1行 乙個數t,表示輸入的測試數量 1 t 1000 第2 t 1行 每行8個數,x1,y1,x2,y2,x3,y3,x4,y4。10 8 xi,yi 10 ...
線段是否相交
給定兩條線段,判斷是否相交 include include use sort include use fabs using namespace std struct point 點座標 struct line 線段屬性 void isintersect line line1,line line2 i...
線段相交判斷
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....