問題描述:已知兩條線段p1p2和q1q2,判斷p1p2和q1q2是否相交,若相交,求出交點。
兩條線段的位置關係可以分為三類:有重合部分、無重合部分但有交點、無交點。
演算法的步驟如下:
1.快速排斥實驗。
設以線段p1p2為對角線的矩形為r,設以線段q1q2為對角線的矩形為t,如果r和t不相交,則兩線段不相交。
2.跨立實驗。
如果兩線段相交,則兩線段必然相互跨立對方。
若p1p2跨立q1q2,則向量(p1-q1)和(p2-q1)位於向量(q2-q1)的兩側,即( p1 - q1 ) × ( q2 - q1 ) * ( p2 - q1 ) × ( q2 - q1 ) < 0。
若q1q2跨立p1p2,則向量(q1-p1)和(q2-p1)位於向量(p2-p1)的兩側,即( q1 - p1 ) × ( p2 - p1 ) * ( q2 - p1 ) × ( p2 - p1 ) < 0。
排斥實驗和跨立實驗的示例如下圖所示。
3.計算交點。
當判定兩條線段相交後,可以進行交點的求解,求交點可以用平面幾何方法,列點斜式方程來完成。但由於點斜式方程難以處理斜率為0的特殊情況,不方便求解。因而,參用向量法求解交點。
設交點為(x0,y0),則下列方程組成立:
根據以上方程組,消除引數k1和k2,得到如下方程:
然後求解(x0,y0),結果如下所示:
排斥實驗
7bool isrectcross(const point &p1,const point &p2,const point &q1,const point &q2)815
//跨立判斷
16bool islinesegmentcross(const point &pfirst1,const point &pfirst2,const point &psecond1,const point &psecond2)
1738
39bool getcrosspoint(const point &p1,const point &p2,const point &q1,const point &q2,long &x,long &y)
4057}58
return
false
;59 }
北京G,計算幾何,線段相交
bfs肯定沒問題了,不過中間的判斷非常噁心 關鍵是三角形 出題人 這題很容易懷疑人生 提供幾組資料 from zm 2 0 00 2 2 0.2 1 10 1 1 0.2 0.5 0.5 0.5 1.5 1.5 0.5 計算幾何的邊界好搞啊 include include include inclu...
計算幾何 判斷線段相交(一)
兩個線段的交點個數可能有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 問題描述 基本問題 判斷二維平面上的兩條線段是否相交。注意 相交有很多種,這裡指的 相交 是指兩條線段恰好有唯一乙個不是端點的...